@SequenceGenerator - allocationSize,使用Eclipse Hibernate Tools进行逆向工程

时间:2010-05-17 08:34:53

标签: eclipse hibernate reverse-engineering hibernate-tools

我使用Eclipse Hibernate Tools从我的Oracle数据库创建带有JPA注释的域类。为了控制序列生成,我在hibernate.reveng.xml中添加了以下条目:

...
<primary-key>
<generator class="sequence">
<param name="sequence">SEQ_FOO_ID</param>
</generator>
</primary-key>
...

这会产生以下注释:

@SequenceGenerator(name = "generator", sequenceName = "SEQ_FOO_ID")

但是我需要像这样设置“allocationSize”:

@SequenceGenerator(name = "generator", sequenceName = "SEQ_FOO_ID", allocationSize = 1)

是否可以在hibernate.reveng.xml中以某种方式设置它?

6 个答案:

答案 0 :(得分:2)

是的,你可以。 你必须重写聆听课程的策略。

Hibernate帮助中心有文档。

答案 1 :(得分:2)

虽然Guillaume Husta没有正式支持,但我设法做了一个技巧,因此绕过了这个限制。而不是简单地把:

 <param name="sequence">MYSEQ</param>

您可能会注意到,生成器只在开始和结束时附加引号(“),因此您可以在sql注入中执行类似的操作,您只需要jpa注释的另一个参数即使它没有真正使用,也会结束引用,例如参数“schema”

   <param name="sequence">MYSEQ", allocationSize = 1, schema="MYSCHEME</param>

答案 2 :(得分:1)

2014年当前版本的Hibernate Tools(4.3.1.CR1)似乎无法实现!

与序列相关的JPA注释由类generateAnnIdGenerator()中的方法EntityPOJOClass生成。
GitHub中的代码:https://github.com/hibernate/hibernate-tools/blob/master/src/java/org/hibernate/tool/hbm2x/pojo/EntityPOJOClass.java#L252

源代码摘录(generateAnnIdGenerator()):
builder.resetAnnotation( importType("javax.persistence.SequenceGenerator") ) .addQuotedAttribute( "name", "generator" ) // TODO: shouldn't this be unique, e.g. entityName + sequenceName (or just sequencename) ? .addQuotedAttribute( "sequenceName", properties.getProperty( org.hibernate.id.SequenceGenerator.SEQUENCE, null ) ); // TODO HA does not support initialValue and allocationSize

JIRA(https://hibernate.atlassian.net/browse/HBX/)未发现此问题。

答案 3 :(得分:1)

也许迟到但正确的配置是:

<hibernate-reverse-engineering>
    <schema-selection match-schema="SchemaName" />
    <table-filter match-name=".*"></table-filter>
    <table name="TableName">
        <primary-key>
            <generator class="org.hibernate.id.SequenceGenerator">
                <param name="sequence">SequenceName</param>
            </generator>
            <key-column name="ColumnName" />
        </primary-key>
    </table>
</hibernate-reverse-engineering>

答案 4 :(得分:0)

例如:

<hibernate-reverse-engineering>
    <schema-selection match-schema="SchemaName" />
    <table-filter match-name=".*"></table-filter>
    <table name="TableName">
        <primary-key>
            <generator class="sequence">
                <param name="sequence">SequenceName</param>
            </generator>
            <key-column name="ColumnName" />
        </primary-key>
    </table>
</hibernate-reverse-engineering>

:)

答案 5 :(得分:0)

您可以更新原始免费标记模板以适应您的要求。 我们这样做如下:

1)向表的reveng条目添加“ allocation-size-50”元属性:

<table name="Checklisteneintrag" >
    <meta attribute="allocation-size-50"/>
    <primary-key>
        <generator class="sequence">
            <param name="sequence_name">Checklisteneintrag_Seq</param>
        </generator>
    </primary-key>
</table>

2)获取原始的“ Ejb3PropertyGetAnnotation.ftl”,并将其改编为以以下代码开头:

<#if ejb3>
<#if pojo.hasIdentifierProperty()>
    <#if property.equals(clazz.identifierProperty)>
        <#if pojo.hasMetaAttribute("allocation-size-50")>
            ${pojo.generateAnnIdGenerator()?replace('@SequenceGenerator(', '@SequenceGenerator(allocationSize=50, initialValue=1, ')}
        </#if>
        <#if !pojo.hasMetaAttribute("allocation-size-50")>
            ${pojo.generateAnnIdGenerator()?replace('@SequenceGenerator(', '@SequenceGenerator(allocationSize=1, initialValue=1, ')}
        </#if>
    </#if>
</#if>
....

3)将所有ftl文件(原始文件和经过改编的文件)放入一个可以通过逆向工程找到的目录中,例如在Maven中,我们引用templatepath =“ src / hibernate / resources / templates”如下:

        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution> <!-- set MAVEN_OPTS="-Dfile.encoding=UTF-8" && mvn antrun:run@hbm2java -->
                    <id>hbm2java</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="Start generating entities .." />
                            <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" />
                            <hibernatetool templatepath="src/hibernate/resources/templates">
                                <classpath>
                                    <path location="${project.build.directory}/classes" />
                                    <path location="${project.basedir}/src/hibernate/resources" />
                                </classpath>
                                <!-- Note that configurationfile does not work anymore in Hibernate 
                                    5.4.0 -->
                                <jdbcconfiguration propertyfile="src/hibernate/resources/hibernate.properties" revengfile="src/hibernate/resources/hibernate.reveng.xml" reversestrategy="at.rsg.lp.flow.hibernate.FlowRevEngStrategy" packagename="at.rsg.lp.flow.services.jpa.model" detectmanytomany="true" />
                                <!-- jdbcconfiguration configurationfile="src/hibernate/resources/hibernate.cfg.xml"
                                    revengfile="src/hibernate/resources/hibernate.reveng.xml" reversestrategy="at.rsg.lp.flow.hibernate.FlowRevEngStrategy"
                                    packagename="at.rsg.lp.flow.services.impl.jpa" detectmanytomany="true"
                                    / -->
                                <hbm2java destdir="src/main/java" jdk5="true" ejb3="true" />
                            </hibernatetool>
                            <echo message="End generating entities" />
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>