Автоинкремент гибернации не работает
У меня есть столбец в моей БД, для которого установлен 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 ответов
Когда вы используете @Embeddable
или же @EmbeddedId
Предполагается, что значения первичного ключа предоставляются приложением (т. е. состоят из не сгенерированных значений). Ваш @GeneratedValue
аннотация просто игнорируется.
Эта комбинация отлично подходит для меня:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Вот пример, чтобы сделать это
@Id
@Column(name = "col_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long colId;
Вы не можете сделать это вручную с помощью Создать таблицу, и все будет хорошо.
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;
}
}
Возможно, вам нужно пометить поле @id
и не указывать generator
имущество.
Как показано в Hibernate Annotation - 2.2.3.1. Генерируя свойство идентификатора, в следующем примере используется генератор идентификаторов:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() { ... }