java - EclipseLink 和 Hibernate 集成

标签 java eclipse hibernate jpa eclipselink

我们目前正在使用 Eclipse-Link 项目(A) 和一个已填充的数据库(带有序列表)。 对于我的下一个项目(B),我想要/需要使用 Hibernate 访问该数据库并向其写入数据。使用项目 B 中存在的实体完全没问题,我可以保存并读取它。

项目 A 实体是 B 所必需的,因此我将它们包含在构建路径中。尽管当我尝试从项目 A 保存实体时,我收到了几个错误。

项目A中的基础类测试

@Entity
@Table(name = "test")
public class Test implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private String name;

public Test() {
}

public Test(String name) {
this.name = name;
}

// getter & setter
....

}

类测试已添加到我的 sessionFactory

Configuration configuration = new Configuration();
configuration.configure().addAnnotatedClass(Test.class);
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
sessionFactory = configuration.buildSessionFactory(serviceRegistry);

当我尝试在项目 B 中保存测试对象时出现异常

Hibernate: insert into test (name) values (?)
Nov 21, 2013 1:27:41 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1364, SQLState: HY000
Nov 21, 2013 1:27:41 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Field 'ID' doesn't have a default value
org.hibernate.exception.GenericJDBCException: could not execute statement
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2989)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3501)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:393)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:227)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:207)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:191)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
    at com.sun.proxy.$Proxy12.save(Unknown Source)
    at de.main.Dao.save(Dao.java:31)
    at de.main.Main.main(Main.java:47)
Caused by: java.sql.SQLException: Field 'ID' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
    ... 29 more

最佳答案

GenerationType.AUTO 让提供者选择它想要使用的内容,这在 EclipseLink 中与 Hibernate 中不同。 EclipseLink 将使用序列表( http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey ),虽然我相信 Hibernate 它取决于数据库 - 但在您的情况下,它似乎假设使用 Identity 来分配它,或者 key 将存在于插入语句中。由于您的表未设置用于排序或身份,因此您需要指定 EclipseLink 默认使用的表生成,如下所示:

@Id
@GeneratedValue(generator="testSequence")
@TableGenerator(name="testSequence", table="SEQUENCE",
            pkColumnName="SEQ_NAME", valueColumnName="SEQ_COUNT",
            pkColumnValue="TEST_GEN")
private int id;

您必须验证所使用的 SEQUENCE 表和列名称和值。

关于java - EclipseLink 和 Hibernate 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20121354/

相关文章:

java - 如何为 openimaj 创建 pom.xml?

java - 将列表与数据库同步的最佳方法

eclipse - Pydev "Undefine variable from import"在 Ubuntu 上使用 pygame 而不是 Windows

java - 项目中所需库 tomcat-embed-websocket 的存档无法读取或不是有效的 ZIP 文件

java - Hibernate UserType 将@Formula 结果映射到非实体自定义对象

hibernate - Grails域-具有多个父级联行为的子级

java - 如何将多对多关联映射到映射到两个不同表的类?

java - Android setRequestProperty 在 url.openConnection()

java - 无法删除、更改、更改...列名称 'number of shares' 带空格

java - 如何在Eclipse中的代码上显示覆盖颜色?