我正在开发一个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)源代码,并在部署期间以及应用程序运行时调试了“Sequencing”机制。在部署期间,我发现要初始化Sequence'TEST',但是在运行时,没有生成Id。
BTW,我的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>
你有什么线索,关于这里发生了什么?
答案 0 :(得分:0)
最后,我找到了解决方案。罪魁祸首是在persistence.xml文件中定义的Eclipse-Link属性'eclipselink.id-validation':
<property name="eclipselink.id-validation" value="NULL"/>
实际上,我已经知道了这一点,定义此属性会阻止ID /序列生成,as discussed in this thread。但是,我认为只有在属性设置为“无”时才适用。在我的例子中,它被设置为'NULL'。此外,即使设置了此属性,SequenceGenerator也能正常工作。所以,从逻辑上讲,我认为当属性设置为“NULL”时,TableGenerator(使用TableSequence - 根据EclipseLink的源代码)应该可以工作。所以,删除这个属性对我有用。
另请注意,以下属性对TableGenerator具有相同的效果(未生成Id / Sequence):
<property name="eclipselink.allow-zero-id" value="true"/>