2010-05-25 85 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; 
    } 



}