我正在开发一个 JAVAEE Enterprise 应用程序,它具有以下技术堆栈:Glassfish 3.1、EJB 3.1、EclipseLink 2.4.2、SQL Server 2008 R2。在 EJB 模块中,我有几个使用 SequenceGenerator 的实体和几个使用 TableGenerator 的实体。
SequenceGenerator 工作正常,但 TableGenerator 不是。我试图通过将 EclipseLink 的日志记录设置为“ FINEST ”来检查 server.log,但我没有看到为获取 Id 的下一个值而记录的任何查询。使用 TableGenerator 的 EJB 实体如下:
@Entity
@Table(name = "TEST")
@TableGenerator(name = "test_gen", table = "ID_GENERATOR", pkColumnName = "ID_NAME", pkColumnValue = "TEST", valueColumnName = "ID_VAL", allocationSize = 50, initialValue = 1)
public class Test extends SuperClass implements Interface1, Interface2, Interface3, Interface4, Interface5, Serializable {
private static final long serialVersionUID = 5084413459400887388L;
/** The id of the entry.
*/
protected long id = 0;
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "test_gen")
@Column(name = "NWTID", nullable = false, updatable = false)
@Override
public long getId() {
return id;
}
.....
}
注意:表 'ID_GENERATOR' 被所有带有 TableGenerator 注释的实体使用,具有唯一的生成器名称。
在使用 ' FINEST ' 设置检查日志后,我尝试了许多其他方法,但无法让 'TableGenerator' 工作。后来,我下载了 EclipseLink (2.4.2) 的源代码并在部署期间以及在应用程序运行时调试了“排序”机制。在部署期间,我发现要初始化序列“TEST”,但在运行时,没有生成 Id。
顺便说一句,我的 persistence.xml 有几个数据源,EclipseLink 具有以下属性:
<persistence-unit name="TestCtx" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>TESTDS</jta-data-source>
<properties>
<property name="eclipselink.target-database" value="SQLServer"/>
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.weaving" value="static"/>
<property name="eclipselink.id-validation" value="NULL"/>
<property name="javax.persistence.validation.mode" value="NONE"/>
<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
<property name="eclipselink.logging.thread" value="false"/>
<property name="eclipselink.logging.session" value="false"/>
<property name="eclipselink.logging.timestamp" value="false"/>
<property name="eclipselink.logging.exceptions" value="false"/>
</properties>
</persistence-unit>
你知道这里发生了什么吗?