2014-01-21 21 views
0
  • 表1只有兩列形成組合鍵。
  • 表2 id列正在生成。
  • Table1的一個屬性的值我正在提供,第二個屬性我需要它來拾取Table2的生成值。 這裏是我有這麼遠

複合主鍵:要在另一個實體中引用的組合鍵的一個ID

public class PKClass implements Serializable 
{ 
    private static final long serialVersionUID = -2092390836751020965L; 
    public PKClass(){} 
    public PKClass(long actId, long actAttId){ 
     this.actvId = actId; 
     this.actvAtId = actAttId; 
    } 

    private long actvId; 
    private long actvAtId; 
    // getters, setters, equals, hashcode 
} 

實體1類:

@Entity @Table(name = "Table1") 
@IdClass(PKClass.class) 
public class AtLinkData implements Serializable 
{ 
    @Id @Column(name = "ACT_ID", nullable = false) 
    private long actvId; 
    @Id @Column(name = "ACT_AT_ID") 
    private long actvAtId; 
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, , mappedBy = "atLinkData") 
    @JoinColumn(name = "ACT_AT_ID") 
    private AtData atData; 
    // getters, setters 
} 

實體2類:

@Entity @Table(name = "Table2") 
public class AtData implements Serializable 
{ 
    @TableGenerator(name = "somename", table = "sometable", pkColumnName = "somecolumn", valueColumnName = "valuename", pkColumnValue = "Table2", allocationSize = 1) 
    @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "somename") 
    @Column(name = "ACT_AT_ID") 
    private Long id; 
    // other variables 
    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "ACT_AT_ID") 
    private AtLinkData atLinkData; 
    // getters setters 
} 

我有一直在嘗試不同的事情,但通過上面的代碼,我得到了婷錯誤:

Caused by: org.hibernate.MappingException: broken column mapping for: atLinkData.id of: com.test.database.AtData 

回答

0

這是我如何解決它:

AtLinkData.java

@Id 
@GeneratedValue(generator = "foreignGenerator") 
@org.hibernate.annotations.GenericGenerator(name = "foreignGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "atData")) 
@Column(name = "ACT_AT_ID") 
private long actvAtId; 

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "ACT_AT_ID",insertable=false,updatable=false) 
private AtData atData; 
// getters, setters 

AtData.java

@OneToOne(fetch = FetchType.LAZY, mappedBy="atData") 
private AtLinkData atLinkData; 

謝謝@CycDemo爲您的幫助。

3

@OneToOne(的mappedBy = 「活動促銷」) 使用JoinColumns標註不JoinColumnAtData實體

@OneToOne(fetch = FetchType.LAZY) 
@JoinColumns({ 
    @JoinColumn(name = "ACTVID", referencedColumnName = "ACTVID"), 
    @JoinColumn(name = "ACTVATID", referencedColumnName = "ACTVATID") 
}) 
private AtLinkData atLinkData; 

數據庫表,你必須添加兩個外鍵列ACTVIDACTVATID

更新

如果你不能在Table 2添加新列,在AtData實體,不AtLinkData使用mappedBy屬性。嘗試如下。

AtLinkData.java

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "ACT_AT_ID") 
private AtData atData; 

AtData.java

@OneToOne(fetch = FetchType.LAZY, mappedBy="atData") 
private AtLinkData atLinkData; 
+0

我不能在表2中添加另一列,它是一個現有的表。 – Chiranjib

+0

@Chiranjib檢查我的更新信息。 – CycDemo

+0

建議更改代碼,現在代碼失敗,因爲PKClass中的actvAtId爲空,因此hashcode()失敗。我應該在AtLinkData中實例化PKClass嗎?據我所知,我猜不是。 :/ 現在,如果我單獨嘗試,實體AtData正在成功保存。 – Chiranjib

相關問題