我有 PersistentBag class 但需要 ArrayList class
I have PersistentBag class but need ArrayList class
我正在尝试编写简单的宠物项目,我在 DAO 层使用 Hibernate。我有实体组和现场学生。
@Data
@AllArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
@Entity
@Table(name = "groups")
@NamedQueries({
@NamedQuery(name = "get all groups", query = "from Group"),
@NamedQuery(name = "find group by id", query = "select g from Group g join fetch g.students where g.id=:groupId"),
@NamedQuery(name = "find group by name", query = "from Group g where g.name like :groupName"),
@NamedQuery(name = "find number of groups", query = "select count(*) from Group"),
@NamedQuery(name = "find group and sort by name", query = "from Group order by name, id"),
@NamedQuery(name = "find group and sort by id", query = "from Group order by id")
})
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;
@Column
private String name;
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(
name="studentsGroups",
joinColumns=@JoinColumn(name="groupId"),
inverseJoinColumns=@JoinColumn(name="studentId")
)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Student> students;
}
例如在 DAO 层我有方法
@Transactional
public Optional<Group> findById(int groupId) {
Session session = sessionFactory.getCurrentSession();
return Optional.ofNullable(session.get(Group.class, groupId));
}
我想检查我的 DAO,我正在编写 junit 测试。我使用 assertThat 来比较来自数据库的实体和来自测试数据的实体。在测试数据中,现场学生的类型为 ArrayList,但从 Hibernate 中获取类型为 PersistentBag,尽管所有数据都相同,但我无法比较这些字段。
@Test
public void givenFindGroupById_whenFindGroupById_thenGroupWasFound() {
Optional<Group> actual = groupDao.findById(2);
assertThat(actual).isPresent().get().isEqualTo(expectedGroups.get(1));
}
List<Group> expectedGroups = Arrays.asList(
Group.builder().id(1).name("a2a2").students(expectedStudentsForGroupA2A2Name).build(),
Group.builder().id(2).name("b2b2").students(expectedStudentsForGroupB2B2Name).build(),
Group.builder().id(3).name("c2c2").students(expectedStudentsForGroupC2C2Name).build(),
Group.builder().id(4).name("d2d2").students(expectedStudentsForGroupD2D2Name).build());
有什么方法可以将 PersistentBag 转换为 ArrayList,还是我做错了什么?
PersistentBag 对 equals() 和 hashCode() 使用 Object 的 equals 方法 Bug.
修复:
通过在其上添加 @EqualsAndHashCode.Exclude 排除学生字段以进行相等检查。
现在断言 Students 值:assertThat(actual.get().getStudents()).containsOnlyElementsOf(expectedGroups.get(1).getStudents())
我正在尝试编写简单的宠物项目,我在 DAO 层使用 Hibernate。我有实体组和现场学生。
@Data
@AllArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
@Entity
@Table(name = "groups")
@NamedQueries({
@NamedQuery(name = "get all groups", query = "from Group"),
@NamedQuery(name = "find group by id", query = "select g from Group g join fetch g.students where g.id=:groupId"),
@NamedQuery(name = "find group by name", query = "from Group g where g.name like :groupName"),
@NamedQuery(name = "find number of groups", query = "select count(*) from Group"),
@NamedQuery(name = "find group and sort by name", query = "from Group order by name, id"),
@NamedQuery(name = "find group and sort by id", query = "from Group order by id")
})
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;
@Column
private String name;
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(
name="studentsGroups",
joinColumns=@JoinColumn(name="groupId"),
inverseJoinColumns=@JoinColumn(name="studentId")
)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Student> students;
}
例如在 DAO 层我有方法
@Transactional
public Optional<Group> findById(int groupId) {
Session session = sessionFactory.getCurrentSession();
return Optional.ofNullable(session.get(Group.class, groupId));
}
我想检查我的 DAO,我正在编写 junit 测试。我使用 assertThat 来比较来自数据库的实体和来自测试数据的实体。在测试数据中,现场学生的类型为 ArrayList,但从 Hibernate 中获取类型为 PersistentBag,尽管所有数据都相同,但我无法比较这些字段。
@Test
public void givenFindGroupById_whenFindGroupById_thenGroupWasFound() {
Optional<Group> actual = groupDao.findById(2);
assertThat(actual).isPresent().get().isEqualTo(expectedGroups.get(1));
}
List<Group> expectedGroups = Arrays.asList(
Group.builder().id(1).name("a2a2").students(expectedStudentsForGroupA2A2Name).build(),
Group.builder().id(2).name("b2b2").students(expectedStudentsForGroupB2B2Name).build(),
Group.builder().id(3).name("c2c2").students(expectedStudentsForGroupC2C2Name).build(),
Group.builder().id(4).name("d2d2").students(expectedStudentsForGroupD2D2Name).build());
有什么方法可以将 PersistentBag 转换为 ArrayList,还是我做错了什么?
PersistentBag 对 equals() 和 hashCode() 使用 Object 的 equals 方法 Bug.
修复:
通过在其上添加 @EqualsAndHashCode.Exclude 排除学生字段以进行相等检查。
现在断言 Students 值:assertThat(actual.get().getStudents()).containsOnlyElementsOf(expectedGroups.get(1).getStudents())