2014-07-11 13 views
0

我有兩個實體,我想在其中創建一個關係,以便共享主鍵。而當我們提交一個實體時,另一個實體也應該使用爲第一個實體生成的相同主鍵進行提交。此類的ID必須在調用save()時手動分配,當實體之間有主鍵關係時

我的第一個實體是用戶

@Entity 
@Table(name = "ENDUSER") 
public class User extends LongIdBase implements IActivatable, IUser { 
    @Column(name = "first_name") 
    private String firstName; 
    @Column(name = "last_name") 
    private String lastName; 
    @OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, targetEntity = UserLoginRecord.class) 
    @PrimaryKeyJoinColumn(name = "id") 
    private UserLoginRecord userLoginRecord; 

我的第二個實體是UserLoginrecord

@Entity 
@Table(name = "ENDUSER_TEMP") 
public class UserLoginRecord { 
    @Id 
    @Column(name = "id") 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "name") 
    private String name; 

我想,當我堅持用戶,爲UserLoginRecord新行也應與同一個主爲創建用戶。

但試圖堅持,我得到下面的這個錯誤。

ids for this class must be manually assigned before calling save(): 
+0

請參閱鏈接的類似問題 - http://stackoverflow.com/questions/787698/jpa-hibernate-one-to-one-relationship – Atul

回答

3
  1. 你得到這個錯誤,因爲無論何時,除非指定一個標識符生成器中,「分配」,發電機將承擔。分配的標識符期望您手動設置ID,因此我認爲您有興趣自動生成ID。

    嘗試將其更改爲:

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    
  2. 用戶應該是用戶/ userLoginRecord協會這樣的所有者:

    @Entity 
    @Table(name = "ENDUSER") 
    public class User extends LongIdBase implements IActivatable, IUser { 
    
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
    
        public Long getId() { 
         return id; 
        } 
    
        public void setId(Long id) { 
         this.id = id; 
        } 
    
        @Column(name = "first_name") 
        private String firstName; 
    
        @Column(name = "last_name") 
        private String lastName; 
    
    } 
    
  3. 我認爲用戶可以有更多的UserLoginRecords這意味着用戶將擁有與UserLoginRecord的一對多關聯,並且UserLoginRecord將與用戶具有多對一的關聯。

  4. 假設你有一個用戶和UserLoginRecord之間的一個一對一的關係

    的UserLoginRecord樣子:

    @Entity 
    @Table(name = "ENDUSER_TEMP") 
    public class UserLoginRecord { 
    
        @Id 
        @Column(name="userId", unique=true, nullable=false) 
        private Long userId; 
    
        @OneToOne(cascade = CascadeType.ALL) 
        @JoinColumn(name="userId") 
        @MapsId 
        private User user; 
    
  5. 對於雙向one-to-one關聯,用戶可以還包含:

    @OneToOne(mappedBy = "user") 
        private UserLoginRecord userLoginRecord; 
    

    如果您要進行雙向關聯,請不要忘記在保存前設置雙方:

    user.setUserLoginRecord(userLoginRecord); 
        userLoginRecord.setUser(user); 
    

    即使userLoginRecord.user端是此關聯的所有者,並且user.userLoginRecord是「反向」端。

相關問題