@SequenceGenerator-使用EclipseHibernate工具进行分配、逆向工程
我使用EclipseHibernate工具从Oracle数据库创建带有JPA注释的域类。为了控制序列生成,我在hibernate.reveng.xml中添加了以下条目:@SequenceGenerator-使用EclipseHibernate工具进行分配、逆向工程,eclipse,hibernate,reverse-engineering,hibernate-tools,Eclipse,Hibernate,Reverse Engineering,Hibernate Tools,我使用EclipseHibernate工具从Oracle数据库创建带有JPA注释的域类。为了控制序列生成,我在hibernate.reveng.xml中添加了以下条目: … SEQ_FOO_ID ... 这将产生以下注释: @SequenceGenerator(name=“generator”,sequenceName=“SEQ\u FOO\u ID”) 但是,我需要如下设置“allocationSize”: @SequenceGenerator(name=“generator
…
SEQ_FOO_ID
...
这将产生以下注释:
@SequenceGenerator(name=“generator”,sequenceName=“SEQ\u FOO\u ID”)
但是,我需要如下设置“allocationSize”:
@SequenceGenerator(name=“generator”,sequenceName=“SEQ\u FOO\u ID”,allocationSize=1)
可以在hibernate.reveng.xml中以某种方式进行设置吗?可以。
你必须重写复仇课的策略
Hibernate帮助中心中有一个文档。例如:
<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>
序列名
:)在2014年的Hibernate Tools()当前版本中,这似乎是不可能的 序列相关的JPA注释由类
EntityProClass
中的方法GenerateAnidGenerator()
生成GitHub中的代码: 源代码提取(GenerateAnidGenerator()):
builder.resetAnnotation(importType(“javax.persistence.SequenceGenerator”))
.AddQuoteAttribute(“名称”、“生成器”)//TODO:这是否应该是唯一的,例如entityName+sequenceName(或仅sequenceName)?
.addQuoteAttribute(“sequenceName”,properties.getProperty(org.hibernate.id.SequenceGenerator.SEQUENCE,null));
//TODO HA不支持initialValue和allocationSize
JIRA()中没有发现此问题的问题。可能很晚,但正确的配置是:
<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>
序列名
尽管Guillaume Husta说它没有得到官方支持,但我还是设法做了一个小动作,绕过了这个限制。而不是简单地说:
<param name="sequence">MYSEQ</param>
MYSEQ
您可能会注意到生成器只在开始和结束处添加引号(“),因此您可以执行类似于sql注入的操作,您只需要jpa注释的另一个参数来结束引号,即使它没有真正使用,例如参数“schema”
MYSEQ”,allocationSize=1,schema=“MYSCHEME
您可以更新原始freemarker模板以适应您的需求。
我们的做法如下:
<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>
1) 将“allocation-size-50”元属性添加到表的reveng条目:
<table name="Checklisteneintrag" >
<meta attribute="allocation-size-50"/>
<primary-key>
<generator class="sequence">
<param name="sequence_name">Checklisteneintrag_Seq</param>
</generator>
</primary-key>
</table>
checklistenentrag_Seq
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>
....
${pojo.generateAnnIdGenerator()?替换('@SequenceGenerator(','@SequenceGenerator(allocationSize=50,initialValue=1'))
${pojo.GenerateAnidGenerator()?替换('@SequenceGenerator(','@SequenceGenerator(allocationSize=1,initialValue=1'))
....
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>
maven antrun插件
hbm2java
没有一个
跑
Ok,但这并不能解决“allocationSize”属性的初始问题?或者我遗漏了什么吗?对不起,我错了。我必须使用而不是序列来解决这个问题。我已经用Eclipse中的搜索/替换解决了这个问题:搜索:@SequenceGenerator.*”replace:$0,allocationSize=1这个答案对我很有帮助-它让我走上了正确的道路。我最终使用了一个自定义的POJOExporter子类(用exporterclass属性将hbmtemplate ant任务指向它)。然后自定义了几个挂起的类,因此,最后,框架调用了我自己的自定义GenerateAnidGenerator()方法,然后我只是对字符串进行了黑客攻击,以满足我的需要。它使用类org.hibernate.id.SequenceGenerator,似乎不是jpa