Java Hibernate 3具有GeneratedValue的复合键1
我在数据库Java Hibernate 3具有GeneratedValue的复合键1,java,hibernate,orm,Java,Hibernate,Orm,我在数据库revisions和Pagu 在Pagu模型中,我必须组合键: id int(由数据库自动生成) 修订id(修订的外键)表 如何在Hibernate3上实现这一点 这就是我想到的 @Entity @Table(name="pagu" ,schema="dbo" ,catalog="dbname" ) @IdClass(PaguId.class) public class Pagu implements java.io.Serializable { privat
revisions
和Pagu
在Pagu
模型中,我必须组合键:
- id int(由数据库自动生成)
- 修订id(修订的外键)表
@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
您必须从主实体类中删除keys id和revisiId,因为它已经存在于@Embeddeble中,请尝试并共享您的响应。我认为不可能在复合键中使用GeneratedValue,您必须选择复合键或单个GeneratedValue-id。您可以找到一个工作示例,解释得很好。您能将您的代码与我之前的注释()中提到的代码进行比较吗?我更新了代码以符合您的示例,并添加了@embeddebleid。这是我使用NetBeans和复合键从数据库对模型进行反向工程时的原始形式。您必须提供自己的值(),不能同时使用
@embeddeble
和@IdClass
。或者选择使用:1<复合主键类上的代码>@embeddedable,实体类中的代码>@EmbeddedId,或2。复合主键类和实体类级别的@IdClass
上没有注释,实体类本身(字段)中有多个@Id
注释。执行此操作还生成异常,具有相同标识符值的不同对象已与会话关联:[id.go.model.Pagu#id.go..model。PaguId@5ae9]
如果@idI上没有@GeneratedValue,我会得到一个类似的错误。我找到了一个创建部分标识符生成的链接,但也有一个警告,这样的构造根本不正确。您可能有兴趣创建自己的ID生成机制。[这将允许您删除@GeneratedValue
注释