Hibernate中的外键共享

时间:2017-04-26 09:41:50

标签: java postgresql hibernate

我的数据库由两个表组成: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    
}

这是我的问题,当为两个用户分配了一个具有相同名称的组织时,所述组织在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,以便将其保存在我的数据库中。

2 个答案:

答案 0 :(得分:0)

确保每次创建新用户时都不分配新的Organisation实例,而是先按名称查询现有组织的数据库,然后重新使用生成的实体所有相关用户,如果它已经存在。

此外,为了正确起见,请考虑在UNIQUE列中添加organisation.name约束。

答案 1 :(得分:0)

由于您不希望为不同的用户提供不同的Oraganisations,因此最好从@GeneratedValue(strategy = GenerationType.AUTO)的{​​{1}}属性中删除Id。这将阻止在DB中创建更多的组织条目。

首先获取OrganisationEntity对象并分配给UserEntity