EclipseLink和TableGenerator - 未生成Id

时间:2013-11-06 22:07:46

标签: java ejb eclipselink

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

你有什么线索,关于这里发生了什么?

1 个答案:

答案 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"/>