【发布时间】:2017-04-26 18:28:22
【问题描述】:
我的数据库由两个表组成: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。如果新用户已经存在,我希望将其分配给新用户。
因此,如果用户 U1 和 U2 是使用名为 O1 的组织创建的,则两者应具有相同的 orga_id,并且应在数据库中仅创建一个组织条目。
如何实现?而我对Hibernate的理解还缺少什么?
应要求,这是我在用户注册时创建 UserEntity 的服务:
@Override
public UserInfo createUser(UserInfo newUser) {
return mapper.map(userDao.save(mapper.map(newUser)));
}
我将带有Mapstruct 的对象映射到UserEntity 并将其发送到我的DAO 以便将其保存在我的数据库中。
【问题讨论】:
-
能否请您发布创建/更新实体的代码?
-
我已经添加了我的服务,如果这还不够,请告诉我。
-
您提到您将两个用户分配给具有“相同”名称的组织,这让我相信您正在创建两个组织实例,并且您给两个用户提供了相同的名称,这不会不要以任何方式告诉hibernate它们实际上是同一个组织。您应该实例化 1 个组织并将其分配给两个用户。您可以在创建 OrganizationEntity 和 UserEntity 的位置发布代码吗?
-
是的,因为组织的每个新对象在保存到数据库时都会创建具有不同 ID 的对象,因此它们将被视为不同的对象。您可以使用唯一约束来阻止相同的组织值再次保留在组织表中。
标签: java postgresql hibernate