2010-05-25 83 views
4

我在我的数据库中设置了Identity(1,1)的列,我无法获得hibernate注释的工作。我尝试创建新记录时遇到错误。休眠自动递增不工作

在我的实体中,我有以下几点。

@Entity 
@Table(schema="dbo", name="MemberSelectedOptions") 
public class MemberSelectedOption extends BampiEntity implements Serializable { 

    @Embeddable 
    public static class MSOPK implements Serializable { 
     private static final long serialVersionUID = 1L; 

     @Column(name="SourceApplication") 
     String sourceApplication; 

     @Column(name="GroupId") 
     String groupId; 

     @Column(name="MemberId") 
     String memberId; 

     @Column(name="OptionId") 
     int optionId; 

     @GeneratedValue(strategy=GenerationType.IDENTITY, generator="native") 
     @Column(name="SeqNo", unique=true, nullable=false) 
     BigDecimal seqNo; 

     //Getters and setters here... 

    } 

    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    MSOPK pk = new MSOPK(); 

    @Column(name="OptionStatusCd") 
    String optionStatusCd; 

    @Column(name="EffectiveDate") 
    Date effectiveDate; 

    @Column(name="TermDate") 
    Date termDate; 

    @Column(name="SelectionStatusDate") 
    Date selectionStatusDate; 

    @Column(name="SysLstUpdtUserId") 
    String sysLstUpdtUserId = Globals.WS_USER_ID;; 

    @Column(name="SysLstTrxDtm") 
    Date sysLstTrxDtm = new Date(); 

    @OneToMany(mappedBy="option") 
    List<MemberSelectedVariable> variables = 
          new ArrayList<MemberSelectedVariable>(); 

     //More Getters and setters here... 
} 

但是,当我尝试添加新记录时出现以下错误。

当IDENTITY_INSERT设置为OFF时,无法在表'MemberSelectedOptions'中为标识列插入显式值。我不想将IDENTIY_INSERT设置为ON,因为我想让db中的标识列管理这些值。

运行的SQL如下;在那里你可以清楚地看到插入。

insert into dbo.MemberSelectedOptions 
    (OptionStatusCd, 
    EffectiveDate, 
    TermDate, 
    SelectionStatusDate, 
    SysLstUpdtUserId, 
    SysLstTrxDtm, 
    SourceApplication, 
    GroupId, 
    MemberId, 
    OptionId, 
    SeqNo) 
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

我在想什么?

+0

我已更新帖子以包含整个文件,没有getters/setters。 – dharga 2010-05-25 18:08:04

+0

我想,我们应该让Hibernate不要插入'SeqNo'。将'SeqNo' getter标记为'@ Id'并且不使用'generator'会有所帮助。 – 2010-05-25 19:15:30

+0

我试过设置insertable = false和updateble = false,但是没有帮助。 – dharga 2010-05-25 19:25:28

回答

0

可能您需要用@id标记您的字段,并且不指定generator属性。

Hibernate Annotation - 2.2.3.1. Generating the identifier property表明,下面的例子中使用的身份发电机:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
public Long getId() { ... } 
+0

我的ID是复合的,我已更新整个文件的帖子 – dharga 2010-05-25 18:26:52

+0

它不适用于@Embeddable。 – iddqd 2010-10-07 13:31:16

0

这个组合适合我的伟大工程:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
1

当您使用@Embeddable@EmbeddedId,主键值应该是提供由应用程序(即由非生成值组成)。您的@GeneratedValue注释被忽略。

+0

这是我的原始设置,它产生了相同的错误。我从另一个SOF职位上得到了“原生”建议。 – dharga 2010-05-25 18:07:26

1

发电机这里的例子做

@Id 
@Column(name = "col_id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long    colId; 
+0

这会创建一个随机密钥 – Joset 2010-08-29 01:56:06

0

你不能用 做手工创建表,一切都会好的。

CREATE TABLE `Forum` (
    `name` varchar(255) NOT NULL, 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `body` varchar(500) DEFAULT NULL, 
    PRIMARY KEY (name,`id`), 
    UNIQUE KEY `id` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin2 




import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 

@Entity 
public class Forum implements Serializable { 

    @EmbeddedId 
    private ForumCompositePK forumPK; 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 7070007885798411858L; 

    @Column(length = 500) 
    String body; 

    public String getBody() { 
     return body; 
    } 

    public void setBody(String body) { 
     this.body = body; 
    } 

    public void setForumPK(ForumCompositePK forumPK) { 
     this.forumPK = forumPK; 
    } 

    public ForumCompositePK getForumPK() { 
     return forumPK; 
    } 

} 




import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Embeddable; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 

@Embeddable 
public class ForumCompositePK implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8277531190469885913L; 


    @Column(unique=true,updatable=false,insertable=false) 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 



}