java generatedvalue_java – 在JPA @GeneratedValue列中手动指定主键的值
我有一个实体,它有一个主键/ ID字段,如下所示:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
这个效果很好我正在使用EclipseLink来创建DDL架构,列正确创建如下:
`id` bigint(20) NOT NULL AUTO_INCREMENT
然而,我有几个实体,我想要自己指定PK(这是一个将数据从旧数据库传输到我们正在构建的新数据库的小应用程序)。如果我指定POJO的ID(使用setId(Long id))并持久化,EclipseLink不保存它(即记录被保存,但是id由eclipseLink自动生成)。
有没有办法手动指定具有@GeneratedValue的列的值?
这里有一些关于这个问题的想法:
我试图通过不使用@GeneratedValue解决问题,但只需手动将列定义为AUTO_INCREMENT。但是,这迫使我手动提供ID,因为EclipseLink验证主键(因此它可能不为null,零或负数)。异常消息读取我应该指定eclipselink.id_validation,但这似乎没有任何区别(我注释到@PrimaryKey(validation = IdValidation.NONE)但仍然有相同的消息)。
澄清:我使用EclipseLink(2.4.0)作为持久性提供程序,我不能从其中切换(大部分项目依赖于eclipselink特定的查询提示,注释和类)。
编辑(响应答案):
自定义排序:我试图实现我自己的排序。我尝试子类化DefaultSequence,但EclipseLink会告诉我Internal Exception:无法找到org.eclipse.persistence.platform.database.MySQLPlatform。但是我已经检查过:该类在类路径上。
所以我分类另一个类NativeSequence:
public class MyNativeSequence extends NativeSequence {
public MyNativeSequence() {
super();
}
public MyNativeSequence(final String name) {
super(name);
}
@Override
public boolean shouldAlwaysOverrideExistingValue() {
return false;
}
@Override
public boolean shouldAlwaysOverrideExistingValue(final String seqName) {
return false;
}
}
但是,我得到的是:
javax.persistence.RollbackException: Exception [EclipseLink-7197] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null or zero primary key encountered in unit of work clone [de.dfv.datenbank.domain.Mitarbeiter[ id=null ]], primary key [null]. Set descriptors IdValidation or the "eclipselink.id-validation" property.
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
...
Caused by: Exception [EclipseLink-7197] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null or zero primary key encountered in unit of work clone [de.dfv.datenbank.domain.Mitarbeiter[ id=null ]], primary key [null]. Set descriptors IdValidation or the "eclipselink.id-validation" property.
at org.eclipse.persistence.exceptions.ValidationException.nullPrimaryKeyInUnitOfWorkClone(ValidationException.java:1451)
...
(为了清晰起见,堆栈跟踪缩短)。这是我以前听到的同样的消息。不应该我的子类NativeSequence?如果是这样,我不知道为Sequence或StandardSequence中的抽象方法执行什么。
也许值得注意的是,简单的子类化(不覆盖任何方法),类的工作原理如预期。但是,在shouldAlwaysOverrideExistingValue(…)中恢复为false将不会生成单个值(我逐步浏览程序,并且getGeneratedValue()不被调用一次)。
另外,当我在一个交易中插入某种某种类型的8个实体时,它在数据库中导致了11个记录(这是什么?!)。
编辑(2012-09-01):我还没有解决问题的办法,实现我自己的顺序没有解决。我需要的是一种能够不能明确设置Id的方式(因此它将被自动生成),并且能够显式设置一个Id(因此将用于在数据库中创建记录)。
我试图将列自定义为auto_increment,并忽略@GeneratedValue,但是验证将会启动,不允许我保存这样一个实体。如果我指定一个值!= 0和!= 0,mysql将会抱怨一个重复的主键。
我用尽了想法和选择来尝试。任何? (开始赏金)