2

我使用 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 中以某种方式设置它?

4

6 回答 6

3

虽然它没有像 Guillaume Husta 所说的那样得到官方支持,但我设法做了一个技巧,所以绕过了这个限制。而不是简单地说:

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

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

   <param name="sequence">MYSEQ", allocationSize = 1, schema="MYSCHEME</param>
于 2016-10-14T11:13:57.697 回答
2

是的你可以。你必须重写 reveng 类的策略。

Hibernate帮助中心有文档。

于 2010-09-20T11:19:24.293 回答
1

在 2014 年的当前版本的 Hibernate Tools ( 4.3.1.CR1 ) 中似乎不可能!

generateAnnIdGenerator()序列相关的 JPA 注释由class中的方法生成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/ ) 中没有发现此问题的问题。

于 2014-07-23T15:45:37.210 回答
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>
于 2015-07-06T17:04:57.060 回答
1

您可以更新原始的 freemarker 模板以适应您的要求。我们是这样做的:

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>
于 2019-07-15T16:49:30.450 回答
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>

:)

于 2011-04-19T11:28:50.460 回答