java - hibernate 生成器不会插入唯一标识符

标签 java hibernate orm uniqueidentifier sql-server-2008-express

我正在尝试使用 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 版。

我的注释在映射父类(super class) 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 can see the following insert statement being issued (...). Clearly this is wrong, there is no "id" parameter.

的确,当使用uniqueidentifier SQL Server 类型时,Hibernate 不得不使用newid()。但是您当前的注释并没有告诉它这样做。我想你需要 guid生成器在这里:

@Id
@GenericGenerator(name = "generator", strategy = "guid", parameters = {})
@GeneratedValue(generator = "generator")
public String getId() {
    return id;
}

一些补充说明:

  • GUID 列类型实际上是用来保存由 Microsoft 算法生成的 GUID,您不能使用 Hibernate 的 UUID 算法。
  • 您不需要 Id 上的 Generated 注释,只需将其删除即可。
  • 我也想知道你为什么要“搞乱”AccessType,我会删除它们。
  • 我实际上不会使用 GUID(参见 this article),但这是另一回事了。

关于java - hibernate 生成器不会插入唯一标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079060/

相关文章:

java - 使用 Securesocial 注释保护的单元测试方法

java - 范围类 : java interoperability

java - 如何在 src/main/resources 中创建文件

eclipse - 如何在 Eclipse 中安装 Hibernate Tools?

java - hibernate一级缓存,直接在DB修改记录

java - 无法向 Spring Boot Hibernate JPA 中的现有表添加其他列

java - JPA 表继承和对象映射

hibernate - JPA 2.0多对多附加栏

php - 我们可以在 symfony2 的多个包中使用通用( Doctrine )orm 文件吗?

java - 如何使用 Spring Data Neo4J 4 和 IO Platform 1.1.3 制作嵌入式服务器?