0

我正在开发一个 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>

你知道这里发生了什么吗?

4

1 回答 1

0

最后,我找到了解决方案。罪魁祸首是在 persistence.xml 文件中定义的 Eclipse-Link 属性“eclipselink.id-validation”:

<property name="eclipselink.id-validation" value="NULL"/>

实际上,我已经知道这一点,定义此属性将停止 ID/Sequence 生成,如该线程中所述。但是,我认为这仅适用于属性设置为“无”的情况。就我而言,它设置为“NULL”。此外,即使设置了此属性,SequenceGenerator 也可以正常工作。因此,从逻辑上讲,当属性设置为“NULL”时,我认为 TableGenerator(根据 EclipseLink 的源代码使用 TableSequence)应该可以工作。因此,删除此属性对我有用。

另外,请注意,以下属性对 TableGenerator 具有相同的效果(未生成 Id/Sequence):

<property name="eclipselink.allow-zero-id" value="true"/>
于 2013-11-07T20:46:05.127 回答