加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – hibernate生成器不会与uniqueidentifier一起插入

发布时间:2020-12-15 08:34:10 所属栏目:Java 来源:网络整理
导读:我正在尝试使用Hibernate Annotations映射实体,以便在创建和保存记录(通过级联)时,会自动生成ID.使用我当前的设置(或我尝试过的其他一些设置),我收到以下错误: ...org.hibernate.exception.ConstraintViolationException: could not insert: [com.gorkwobbl
我正在尝试使用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-type 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上生成注释,只需将其删除即可.
>我也想知道你为什么“搞乱”机智AccessType,我会删除它们.
>我实际上不会使用GUID(见this article),但这是另一个故事.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读