我的数据库由两个表组成:OrganisationUser,在ManyToOne关系中,一个组织可以容纳许多用户。
在我分享我的问题之前,这里是我的实体:

@Entity
@Table(name = "organisation")
public class OrganisationEntity {
    @Id
    @Column(name = "orga_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String name;

    // Getters & Setters
}

-
@Entity
@Table(name = "\"user\"")
public class UserEntity {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String email;

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    @NotNull
    private String password;

    @ManyToOne(targetEntity = OrganisationEntity.class,cascade = CascadeType.ALL)
    @JoinColumn(name = "orga_id")
    private OrganisationEntity organisation;

    // Getters & Setters
}

这是我的问题,当两个用户被分配了一个具有相同名称的组织时,该组织在2个不同ID的Organisation表中创建了两次。如果它已经存在,我希望给新用户分配一个组织ID。
因此,如果用户U1和U2是由一个名为O1的组织创建的,那么两者应该具有相同的orga_id,并且数据库中只应创建一个组织条目。
如何才能做到这一点?我对Hibernate的理解中缺少了什么?
根据要求,这里是我的服务,在用户注册时创建UserEntity
@Override
public UserInfo createUser(UserInfo newUser) {
    return mapper.map(userDao.save(mapper.map(newUser)));
}

我将带有Mapstruct的对象映射到UserEntity并将其发送到我的DAO以便将其保存在我的数据库中。

最佳答案

确保每次创建新用户时不分配新的Organisation实例,而是按名称首先查询现有组织的DB,如果已经存在,则重新使用所有相关用户生成的实体。
此外,为了正确起见,考虑向UNIQUE列添加organisation.name约束。

10-08 19:27