Shivay Shivay - 5 months ago 34
MySQL Question

Hibernate one to one mapping on composite foreign key and primary key in single table

I have a Catagory table, with composite primary key and foreign key. My table structure is like

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);


and I want a ORM mapping with Catagory class like this

public class Catagory {
@EmbeddedId
private CatagoryPk pk ;
@Column(name="CATAGORY_NAME")
private String catagoryName;

private Catagory parentId;

private List<Catagory> childs ;

}
@Embeddable
public class CatagoryPk {
@Column(name="VERSION")
private Integer version;
@Column(name="CATEGORY_ID")
private Integer catagoryId;
}


Now how to annotate

private Catagory parentId;
private List<Catagory> childs ;

Answer
@JoinColumns({
    @JoinColumn(name="VERSION", referencedColumnName="VERSION"),
    @JoinColumn(name="PARENT_ID", referencedColumnName="CATAGORY_ID")
})
@ManyToOne
private Catagory parentId;

@OneToMany(mappedBy="parentId")
private List<Catagory> childs;  

or version with @IdClass instead of @EmbeddableId (tested with 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;
}