6

DB に Identity(1,1) が設定された列があり、休止状態の注釈が機能しません。新しいレコードを作成しようとするとエラーが発生します。

私のエンティティには、次のものがあります。

@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' の ID 列に明示的な値を挿入できません。IDENTIY_INSERT を ON に設定したくありません。データベースの ID 列で値を管理したいからです。

実行される SQL は次のとおりです。インサートがはっきりと見える場所。

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

私は何が欠けていますか?

4

6 に答える 6

2

@Embeddableまたはを使用する場合@EmbeddedId、主キーの値はアプリケーションによって提供されるものと想定されます (つまり、生成されていない値で構成されます)。あなたの@GeneratedValue注釈は無視されます。

于 2010-05-25T14:50:05.617 に答える
1

ここにそれを行う例があります

@Id
@Column(name = "col_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long             colId;
于 2010-06-05T13:36:16.220 に答える
1

この組み合わせは私にとってうまくいきます:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
于 2010-05-25T14:47:43.923 に答える
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;
    }



}
于 2010-10-07T13:29:57.660 に答える
0

複合キーでジェネレーターを使用することはできません

于 2010-05-26T19:18:45.187 に答える
0

@idプロパティを指定せずに、フィールドにマークを付ける必要がある可能性がありgeneratorます。

Hibernate Annotation - 2.2.3.1で示したように。次の例では、ID ジェネレーターを使用して識別子プロパティを生成します。

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() { ... } 
于 2010-05-25T14:43:58.813 に答える