我有 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())