Hibernate在单个表中对复合外键和主键进行一对一映射
我有一个Catagory表,带有复合主键和外键。 我的表结构就像
CREATE TABLE CATAGORY ( CATAGORY_ID int(11) NOT NULL, CATAGORY_NAME varchar(50) DEFAULT NULL, VERSION int(11) NOT NULL, PARENT_ID int(11) DEFAULT NULL, PRIMARY KEY (CATAGORY_ID,VERSION) ); ALTER TABLE CATAGORY ADD CONSTRAINT FOREIGN KEY (PARENT_ID, VERSION) REFERENCES CATAGORY (CATAGORY_ID, VERSION);
我想要像这样的Catagory类进行ORM映射
public class Catagory { @EmbeddedId private CatagoryPk pk ; @Column(name="CATAGORY_NAME") private String catagoryName; private Catagory parentId; private List childs ; } @Embeddable public class CatagoryPk { @Column(name="VERSION") private Integer version; @Column(name="CATEGORY_ID") private Integer catagoryId; }
现在如何注释
private Catagory parentId; private List childs ;
@JoinColumns({ @JoinColumn(name="VERSION", referencedColumnName="VERSION"), @JoinColumn(name="PARENT_ID", referencedColumnName="CATAGORY_ID") }) @ManyToOne private Catagory parentId; @OneToMany(mappedBy="parentId") private List childs;
或使用@IdClass
而不是@EmbeddableId
版本(使用Eclipselink 2.2.1测试):
public class CatagoryPk implements Serializable { private Integer version; private Integer catagoryId; public CatagoryPk() { } public CatagoryPk(Integer version, Integer catagoryId) { this.version = version; this.catagoryId = catagoryId; } } @Entity @IdClass(CatagoryPk.class) public class Catagory { @Column(name="VERSION") @Id private Integer version; @Column(name="CATAGORY_ID") @Id private Integer catagoryId; @ManyToOne @JoinColumns({ @JoinColumn(name="VERSION", referencedColumnName="VERSION", insertable=false, updatable=false), @JoinColumn(name="PARENT_ID", referencedColumnName="CATAGORY_ID") }) private Catagory parentId; }
看一下本指南 。 你必须使用@ManyToOne和@OneToMany注释。