我的数据库由两个表组成: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
}
这是我的问题,当为两个用户分配了一个具有相同名称的组织时,所述组织在Organisation
表中创建了两次,其中包含2个不同的ID。我希望将组织的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
,以便将其保存在我的数据库中。
答案 0 :(得分:0)
确保每次创建新用户时都不分配新的Organisation
实例,而是先按名称查询现有组织的数据库,然后重新使用生成的实体所有相关用户,如果它已经存在。
此外,为了正确起见,请考虑在UNIQUE
列中添加organisation.name
约束。
答案 1 :(得分:0)
由于您不希望为不同的用户提供不同的Oraganisations,因此最好从@GeneratedValue(strategy = GenerationType.AUTO)
的{{1}}属性中删除Id
。这将阻止在DB中创建更多的组织条目。
首先获取OrganisationEntity对象并分配给UserEntity