我的数据库由两个表组成:Organisation
和User
,在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
约束。