休眠中的外键共享
我的数据库由两个表组成: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
实例,而是首先按名称为现有组织查询数据库,并将所得到的实体重新用于所有相关用户如果它已经在那里。
此外,为了正确,请考虑在organisation.name
列中添加UNIQUE
约束。
该查询应该在哪里完成?在DAO中?而不是“只”保存到数据库,我创建了一个方法来检查和保存? – Christopher
由于您不希望针对不同的用户使用不同的组织结构,因此最好从Id
属性OrganisationEntity
中删除@GeneratedValue(strategy = GenerationType.AUTO)
。这将阻止在数据库中创建更多的组织条目。
而且第一次提取OrganisationEntity对象,并分配给UserEntity
了解,它不会创建条目,是吗? – Christopher
能否请您张贴创建/更新实体以及代码? –
我已经添加了我的服务,请让我知道如果这还不够。 – Christopher
您提到您将两个用户分配给具有“相同”名称的组织,这导致我相信您正在创建两个Organization实例,并且您提供的名称相同,但不会以任何方式告诉hibernate他们实际上是同一个组织。您应该实例化1个组织并将其分配给两个用户。你可以在创建OrganizationEntity和UserEntity的地方发布代码吗? –