[英]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.