8317

Question:
<ul><li>Table 1 has only two columns which form a composite key.</li> <li>Table 2 id column is being generated.</li> <li>Value for one property of Table1 I am supplying and for second property I need it to pick up the generated value of Table2. Here is what I have so far-</li> </ul>
Composite primary key:
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
}
Entity class 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
}
Entity class 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
}
I have been trying different things, but with the code above, I am getting the error:
Caused by: org.hibernate.MappingException: broken column mapping for: atLinkData.id of: com.test.database.AtData
Answer1:@OneToOne(mappedBy="otherInfo")
Use JoinColumns
annotation not JoinColumn
.
@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "ACTVID", referencedColumnName = "ACTVID"),
@JoinColumn(name = "ACTVATID", referencedColumnName = "ACTVATID")
})
private AtLinkData atLinkData;
DB table of AtData
entity you have to add two foreign key column ACTVID
and ACTVATID
.
<strong>Update</strong>
If you cannot add new columns in Table 2
, use mappedBy
attribute at AtData
entity, not AtLinkData
. Try as below.
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;
Answer2:Here is how I solved it:
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;
Thanks <a href="https://stackoverflow.com/users/1573835/cycdemo" rel="nofollow">@CycDemo</a> for your help.