[英]Hibernate using a foreign key as part of a composite key
好的,所以我想在Oracle DB上有2個表,這些表要用Spring 3和Hibernate 3用Java表示。它們之間具有“多對一”關系,這些表類似於
CAR
-------
CAR_PK
//... other columns
OPTION
------
CAR_FK
OPTION_TEXT
//... other columns
因為“選項”表僅對汽車有意義,所以我們只關心在訪問汽車時對其進行訪問,因此它沒有自己的唯一PK。 此外,每輛車最多可以有1個選件。 因此,我們使用的是CAR_FK和OPTIONS_TEXT的復合ID
Java是這樣的
public class Car{
@Id
@Column(name="CAR_PK")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CAR_KEY_SEQ")
@SequenceGenerator (name="CAR_KEY_SEQ", sequenceName="CAR_KEY_SEQ", allocationSize=1)
private long carPk;
@OneToMany(cascade= CascadeType.ALL, mappedBy="car")
@JoinColumn(name="CAR_PK")
private List<Option> options;
//... other stuff
}
@IdClass(OptionId.class)
public class Option{
@Id
private long carFk;
@Id
private String optionText;
@ManyToOne
@JoinColumn(name="CAR_FK")
private Car car;
//... other stuff
}
@Emeddable
public class OptionId implements Serializable{
@Column(CAR_FK)
private long carFk;
@Column(OPTION_TEXT)
private String optionText
//... other stuff
}
插入時,我希望為Car對象中的carPk生成的相同鍵插入Option對象中的carFk。 我該怎么辦?
java.sql.SQLException: Invalid column index
我究竟做錯了什么?
第一件事是,由於期權本身不存在,因此不應成為實體。 只有Car是實體對象,而Option是值對象,因此它不應具有自己的任何ID。
您可以將設計更改為
@Entity
public class Car{
@Id
@Column(name="CAR_PK")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CAR_KEY_SEQ")
@SequenceGenerator (name="CAR_KEY_SEQ", sequenceName="CAR_KEY_SEQ", allocationSize=1)
private long carPk;
@Embedded
private List<Option> options;
//... other stuff
}
@Embeddable
public class Option{
private String optionText;
//... other stuff
}
那應該解決您所有的問題。
在定義級聯類型時,上面的代碼中確實有錯別字:
@OneToMany(cascase= CascadeType.ALL, mappedBy="car")
這可能導致您的無效列索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.