Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@SequenceGenerator-使用EclipseHibernate工具进行分配、逆向工程_Eclipse_Hibernate_Reverse Engineering_Hibernate Tools - Fatal编程技术网

@SequenceGenerator-使用EclipseHibernate工具进行分配、逆向工程

@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

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




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