Java 休眠自动增量不工作
我的数据库中有一列设置了标识(1,1),我无法使用hibernate注释。我尝试创建新记录时出错 在我的实体中,我有以下内容Java 休眠自动增量不工作,java,database,hibernate,orm,composite-key,Java,Database,Hibernate,Orm,Composite Key,我的数据库中有一列设置了标识(1,1),我无法使用hibernate注释。我尝试创建新记录时出错 在我的实体中,我有以下内容 @Entity @Table(schema="dbo", name="MemberSelectedOptions") public class MemberSelectedOption extends BampiEntity implements Serializable { @Embeddable public static class MSOPK i
@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...
}
我缺少什么?可能您需要用
@id
标记字段,而不是指定生成器
属性
如中所示,下一个示例使用标识生成器:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() { ... }
这种组合对我来说非常有效:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
当您使用
@embedded
或@EmbeddedId
时,主键值应该由应用程序提供(即由非生成的值组成)。您的@GeneratedValue
注释被忽略。您不能在复合键上使用生成器。以下是执行此操作的示例
@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;
}
}
这是我最初的设置,它产生了相同的错误。我从另一个SOF帖子中得到了“本机”建议。我已经更新了帖子,以包含整个文件,而不包含getter/setter。我认为,我们应该让Hibernate不要插入
SeqNo
。可能将SeqNo
getter标记为@Id
并且不使用generator
会有帮助。我尝试过设置insertable=false和updateble=false,但没有帮助。此外,我有一个复合键,所以我无法将其设置为@IdMy Id是复合的,我已经用我的整个文件问题更新了帖子。
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;
}
}