休眠生成器不会插入唯一标识符
我正在尝试使用 Hibernate Annotations 映射一个实体,以便在创建并保存记录(通过级联)时,会自动生成一个 ID。使用我当前的设置(或我尝试过的其他一些设置),我收到以下错误:
...org.hibernate.exception.ConstraintViolationException:
could not insert: [com.gorkwobbler.shadowrun.karma.domain.AttributeScore]
...java.sql.SQLException:
Caused by: java.sql.SQLException: Cannot insert the value NULL into column 'id', table 'KARMA_DEV.dbo.Character'; column does not allow nulls. INSERT fails.
我可以看到发出以下插入语句:
Hibernate: insert into character (version, alias, firstName, lastName) values (?, ?, ?, ?)
显然这是错误的,没有“id”参数。
目前,我的表架构很简单:
Character(
id uniqueidentifier, --primary key
alias varchar(max),
firstName varchar(max),
lastName varchar(max),
version int --for hibernate
)
我使用的是 SQL Server 2008 R2 Express 版本。
我的注释分为映射的超类 DomainEntity 和具体类 KarmaCharacter:
@MappedSuperclass
public abstract class DomainEntity implements Serializable /* Needed for HOM retainUnsaved */ {
private static final long serialVersionUID = 1L;
private String id;
private Integer version;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Generated(value=GenerationTime.INSERT)
//@GeneratedValue(generator="hibernate-uuid.hex")
//@GenericGenerator(name="hibernate-uuid.hex", strategy="org.hibernate.id.UUIDHexGenerator", parameters=@Parameter(name="separator", value="-"))
@AccessType(value="field")
public String getId() {
return id;
}
@Version
@AccessType(value="field")
public Integer getVersion() {
return version;
}
}
@SuppressWarnings("serial")
@Entity
@Table(name="character")
public class KarmaCharacter extends DomainEntity {
private String alias;
private String lastName;
private String firstName;
private SortedSet<AttributeScore> attributeScores;
public KarmaCharacter() {
//default constructor
}
@Column
@AccessType(value="field")
public String getAlias() {
return alias;
}
@Column
@AccessType(value="field")
public String getFirstName() {
return firstName;
}
@Column
@AccessType(value="field")
public String getLastName() {
return lastName;
}
//...omitted some transient code and a collection property for brevity
public void setAlias(String alias) {
this.alias = alias;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
如果有人能告诉我在 SQL Server 中使用 hibernate 生成 uniqueidentifer 类型 ID 的正确方法,并让它们正确保存,那就太好了赞赏。
I'm trying to map an entity using Hibernate Annotations, so that when a record is created and saved (via cascade), an ID is automatically generated. With my current setup (or a few others I've tried) I get the following error:
...org.hibernate.exception.ConstraintViolationException:
could not insert: [com.gorkwobbler.shadowrun.karma.domain.AttributeScore]
...java.sql.SQLException:
Caused by: java.sql.SQLException: Cannot insert the value NULL into column 'id', table 'KARMA_DEV.dbo.Character'; column does not allow nulls. INSERT fails.
I can see the following insert statement being issued:
Hibernate: insert into character (version, alias, firstName, lastName) values (?, ?, ?, ?)
Clearly this is wrong, there is no "id" parameter.
My table schema, for now, is simply:
Character(
id uniqueidentifier, --primary key
alias varchar(max),
firstName varchar(max),
lastName varchar(max),
version int --for hibernate
)
I am using SQL Server 2008 R2, Express edition.
My annotations are split between a mapped superclass, DomainEntity, and a concrete class, KarmaCharacter:
@MappedSuperclass
public abstract class DomainEntity implements Serializable /* Needed for HOM retainUnsaved */ {
private static final long serialVersionUID = 1L;
private String id;
private Integer version;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Generated(value=GenerationTime.INSERT)
//@GeneratedValue(generator="hibernate-uuid.hex")
//@GenericGenerator(name="hibernate-uuid.hex", strategy="org.hibernate.id.UUIDHexGenerator", parameters=@Parameter(name="separator", value="-"))
@AccessType(value="field")
public String getId() {
return id;
}
@Version
@AccessType(value="field")
public Integer getVersion() {
return version;
}
}
@SuppressWarnings("serial")
@Entity
@Table(name="character")
public class KarmaCharacter extends DomainEntity {
private String alias;
private String lastName;
private String firstName;
private SortedSet<AttributeScore> attributeScores;
public KarmaCharacter() {
//default constructor
}
@Column
@AccessType(value="field")
public String getAlias() {
return alias;
}
@Column
@AccessType(value="field")
public String getFirstName() {
return firstName;
}
@Column
@AccessType(value="field")
public String getLastName() {
return lastName;
}
//...omitted some transient code and a collection property for brevity
public void setAlias(String alias) {
this.alias = alias;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
If someone could tell me the right way to generate uniqueidentifer-type ID's with hibernate in SQL Server, and get them to be saved properly, it would be much appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
事实上,当使用
uniqueidentifier
SQL Server 类型时,Hibernate 必须使用newid()
。但您当前的注释并没有告诉它这样做。我认为你需要guid
生成器:一些附加说明:
Id
上使用Generate
注释,只需将其删除即可。AccessType
,我只想删除它们。Indeed, when using the
uniqueidentifier
SQL Server type, Hibernate has to usenewid()
. But your current annotations are not telling it to do so. I think you need theguid
generator here:Some additional remarks:
Generated
annotation on anId
, just remove it.AccessType
, I would just remove them.