2017-04-26 74 views
1

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

这里是我的问题,当两个用户分配一个组织与相同名字,说组织在具有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我数据库。

+0

能否请您张贴创建/更新实体以及代码? –

+0

我已经添加了我的服务,请让我知道如果这还不够。 – Christopher

+0

您提到您将两个用户分配给具有“相同”名称的组织,这导致我相信您正在创建两个Organization实例,并且您提供的名称相同,但不会以任何方式告诉hibernate他们实际上是同一个组织。您应该实例化1个组织并将其分配给两个用户。你可以在创建OrganizationEntity和UserEntity的地方发布代码吗? –

回答

0

确保每次创建新用户时都不会分配新的Organisation实例,而是首先按名称为现有组织查询数据库,并将所得到的实体重新用于所有相关用户如果它已经在那里。

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

+0

该查询应该在哪里完成?在DAO中?而不是“只”保存到数据库,我创建了一个方法来检查和保存? – Christopher

0

由于您不希望针对不同的用户使用不同的组织结构,因此最好从Id属性OrganisationEntity中删除@GeneratedValue(strategy = GenerationType.AUTO)。这将阻止在数据库中创建更多的组织条目。

而且第一次提取OrganisationEntity对象,并分配给UserEntity

+0

了解,它不会创建条目,是吗? – Christopher