使用GeneratedValue的Hibernate 3 Composite键

时间:2011-11-14 09:09:16

标签: java hibernate orm

我在数据库revisionsPagu

上有这两个表

Pagu模型中,我必须复合键:

  • id int(由数据库自动生成)
  • revision_id(foreign_key to revisions)表

如何在Hibernate 3上实现这个?

这就是我提出的

@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;
 }

这是我的PaguId课程

@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;
   }   


}

当我尝试将其保存在数据库上时出现错误:

org.hibernate.NonUniqueObjectException: a different object with the same    identifier value was already associated with the session:

- 更新 - 但是像这样使用EmbeddedId改变实现

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;
}
....

它编译正确,但在坚持模型时给了我错误。

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): id.model.Pagu

2 个答案:

答案 0 :(得分:3)

我认为在复合键中不能使用GeneratedValue,您必须选择复合键或单个GeneratedValue-id。

答案 1 :(得分:0)

您必须从主要的Entity类中删除您的密钥ID和revisiId,因为它已经存在于@Embeddable中,请尝试并分享您的回复。