2017-04-26 94 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