我有一个具有主键/ id字段的实体,如下所示:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Run Code Online (Sandbox Code Playgroud)
这很好用.我正在使用EclipseLink创建DDL-Schema,并且正确创建了这样的列:
`id` bigint(20) NOT NULL AUTO_INCREMENT
Run Code Online (Sandbox Code Playgroud)
但是,我有几个实体我想要自己指定PK(这是一个将数据从旧数据库传输到我们正在构建的新数据库的小应用程序).如果我指定POJO的ID(使用setId(Long id)
)并保留它,则EclipseLink 不保存它(即保存记录,但id由eclipseLink自动生成).
有没有办法手动指定具有@GeneratedValue的列的值?
这里有一些关于这个问题的想法
我试图通过不使用@GeneratedValue解决问题,而只是手动将列定义为AUTO_INCREMENTed.然而,这迫使我总是手动提供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 could not be found
.但我已经检查过:这个类在classpath上.
所以我继承了另一个类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) { …
Run Code Online (Sandbox Code Playgroud)