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