I have this two tables in the revisions and Pagu
in the Pagu model, I have a composite key:
- id int (autogenerated by database)
- revision_id (foreign_key for revisions) table
How to implement this on Hibernate 3?
that's what i came up with
@Entity @Table(name="pagu" ,schema="dbo" ,catalog="dbname" ) @IdClass(PaguId.class) public class Pagu implements java.io.Serializable { private int id; private int revisiId; private Entitas entitas; private Revisi revisi; ... @Id @GeneratedValue @Column(name="id", unique=true, nullable=false) public int getId() { return this.id; } public void setId(int id) { this.id = id; } @Id @Column(name="revisi_id", unique=true, nullable=false) public int getRevisiId() { return this.revisiId; } public void setRevisiId(int id) { this.id = id; }
And this is my PaguId class
@Embeddable public class PaguId implements java.io.Serializable { private int id; private int revisiId; public PaguId() { } public PaguId(int id, int revisiId) { this.id = id; this.revisiId = revisiId; } @Column(name="id", nullable=false) public int getId() { return this.id; } public void setId(int id) { this.id = id; } @Column(name="revisi_id", nullable=false) public int getRevisiId() { return this.revisiId; } public void setRevisiId(int revisiId) { this.revisiId = revisiId; } public boolean equals(Object other) { if ( (this == other ) ) return true; if ( (other == null ) ) return false; if ( !(other instanceof PaguId) ) return false; PaguId castOther = ( PaguId ) other; return (this.getId()==castOther.getId() && this.getRevisiId()==castOther.getRevisiId()) && (this.getRevisiId()==castOther.getRevisiId()); } public int hashCode() { int result = 17; result = 37 * result + this.getId(); result = 37 * result + this.getRevisiId(); return result; } }
When I try to store this in the database, I got an error:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
- UPDATE-- But changing the implementation using an EmbeddedId like this
public class Pagu implements java.io.Serializable { private PaguId id; ... @EmbeddedId @AttributeOverrides( { @AttributeOverride(name="id", column=@Column (name="id", nullable=false) ), @AttributeOverride(name="revisiId", column=@Column (name="revisi_id", nullable=false) ) } ) public PaguId getId() { return this.id; } public void setId(PaguId id) { this.id = id; } ....
It compiled correctly, but gave me an error while saving the model.
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): id.model.Pagu