Автоинкремент гибернации не работает - PullRequest
4 голосов
/ 25 мая 2010

У меня есть столбец в моей БД, для которого установлен 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...
}

Но когда я пытаюсь добавить новую запись, я получаю следующую ошибку.

Невозможно вставить явное значение для столбца идентификаторов в таблице 'MemberSelectedOptions', когда для IDENTITY_INSERT установлено значение OFF. Я не хочу устанавливать для IDENTIY_INSERT значение ON, потому что хочу, чтобы столбец идентификаторов в БД управлял значениями.

SQL, который выполняется, является следующим; где вы можете ясно видеть вставку.

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

Чего мне не хватает?

Ответы [ 6 ]

1 голос
/ 05 июня 2010

Вот пример, чтобы сделать это

@Id
@Column(name = "col_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long             colId;
1 голос
/ 25 мая 2010

Когда вы используете @Embeddable или @EmbeddedId, значения первичного ключа должны составлять , предоставляемые приложением (т. Е. Составленные из не сгенерированных значений). Ваша @GeneratedValue аннотация просто игнорируется.

1 голос
/ 25 мая 2010

эта комбинация отлично подходит для меня:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
0 голосов
/ 07 октября 2010

Вы не можете сделать это с Создайте таблицу вручную, и все будет хорошо.

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;
    }



}
0 голосов
/ 26 мая 2010

Вы не можете использовать генераторы для составных ключей

0 голосов
/ 25 мая 2010

Возможно, вам нужно пометить ваше поле @id и не указывать generator свойство.

Как показано в Hibernate Annotation - 2.2.3.1. Генерируя свойство идентификатора , в следующем примере используется генератор идентификаторов:

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