Hibernate 3 Composite Key with GeneratedValue Function

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 
+6
source share
2 answers

I don’t think that you can use GeneratedValue in a composite key, you need to choose either a composite key or one GeneratedValue-id.

+3
source

you need to remove both id and revisiId keys from your main Entity class, since it is already present in @Embeddable, try sharing your answer.

0
source

Source: https://habr.com/ru/post/901421/


All Articles