2

我已经建立了一个 maven 项目来从 xsd-Schema 生成 Java 类。首先,我配置了 maven-hyperjaxb3-plugin(参见下面的 pom.xml 片段),以便它可以将默认的 JPA2 注释放在实体中。其中一个注解是@java.persitence.Table(name = "table_name")。我想通过外部全局绑定扩展此注释,以便我也可以将模式名称放入其中。这样我就会得到@java.persitence.Table(name = "table_name", schema = "schema_name")。有没有办法做到这一点?在表名中全局添加前缀怎么样:@java.persitence.Table(name = "prefix_table_name"),有什么想法吗?

问候 Erzen

pom.xml 片段

<groupId>org.jvnet.hyperjaxb3</groupId>
<artifactId>maven-hyperjaxb3-plugin</artifactId>
<version>0.6.0</version>
<executions>
    <execution>
        <goals>
            <goal>generate</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <variant>jpa2</variant>
    <extension>true</extension>
    <roundtripTestClassName>EKMSEnvelopeRoundtripTest</roundtripTestClassName>
    <args>
        <arg>-Xinheritance</arg>
        <arg>-XtoString</arg>
        <arg>-Xannotate</arg>
    </args>
    <schemaExcludes>
        <exclude>ekvaattributes.xsd</exclude>
    </schemaExcludes>
</configuration>

bindings-xjc.xjb 片段

<jaxb:globalBindings localScoping="toplevel">
    <!-- JPA-entities must be serializable -->
    <xjc:serializable />
</jaxb:globalBindings>


<jaxb:bindings schemaLocation="schema.xsd"
    node="/xs:schema">

    <annox:annotate>
        <!-- my attempt -->
        <annox:annotate annox:class="javax.persistence.Table"
            schema="schema_name">
        </annox:annotate>
    </annox:annotate>

    <hj:persistence>
        <hj:default-generated-id name="Hjid">
            <orm:generated-value strategy="IDENTITY" />
        </hj:default-generated-id>
    </hj:persistence>
</jaxb:bindings>
4

4 回答 4

2

的作者在这里。

请参阅@Stefan 的答案,只需添加schema="schema_name"属性:

<orm:table name="item" schema="schema_name"/>

orm:table实际上是一个 JPA XML 元素,因此在 JPA 规范中有记录。:)

请参阅此架构:

https://github.com/highsource/hyperjaxb3/blob/master/ejb/schemas/persistence/src/main/resources/persistence/orm/orm_1_0.xsd#L1814-L1815

我基本上没有在这里发明任何东西。

您不需要 JAXB2 Annotate Plugin,这适用于 OOTB。

这是全局前缀的问题:

http://jira.highsource.org/browse/HJIII-87

还没有解决。现在可以通过自定义命名来解决,但这很尴尬。

https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/custom-naming

我同意,让它可配置会很好。

更新如何在全球范围内执行此操作:

<hj:default-entity>
    <orm:table name="item" schema="schema_name"/>
</hj:default-entity>

但是您还需要自定义关联的默认值等等。在这里查看他的内置默认值:

https://github.com/highsource/hyperjaxb3/blob/master/ejb/plugin/src/main/resources/org/jvnet/hyperjaxb3/ejb/strategy/customizing/impl/DefaultCustomizations.xml

于 2015-09-01T21:47:50.447 回答
2

我不确定这是否可行,但试试这个元素,也许它有一个“模式”属性,遗憾的是它没有很好的记录。

问候,斯特凡

<jaxb:bindings schemaLocation="schema.xsd"
node="/xs:schema">
    <annox:annotate>

    <hj:persistence>
        <hj:default-generated-id name="Hjid">
            <orm:generated-value strategy="IDENTITY" />
        </hj:default-generated-id>
    </hj:persistence>

    <!-- try this -->
    <hj:entity>
        <orm:table name="item"/>
    </hj:entity>
</jaxb:bindings>

来源:http ://confluence.highsource.org/display/HJ3/Customization+Guide

于 2015-09-01T15:49:54.293 回答
2

@lexicore Thnx 寻求帮助。将您的建议放在正确的上下文中后,它起作用了。

    <hj:persistence>
        <hj:default-entity>
            <!-- no need to overwrite the default generated table names-->
            <orm:table schema="schema_name" />
        </hj:default-entity>
    </hj:persistence>
于 2015-09-02T13:31:27.983 回答
0

您还可以在从 persistence.xml 引用的 orm 文件中为所有实体全局定义模式。无需将模式复制到每个@Table注释中。

持久性.xml:

...
  <persistence-unit name="MySchemaPU"  transaction-type="JTA">
     <mapping-file>META-INF/orm.xml</mapping-file>

以及 META-INF 文件夹中的 orm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">
 <persistence-unit-metadata>

  <persistence-unit-defaults>
   <schema>schema_name</schema>
  </persistence-unit-defaults>
 </persistence-unit-metadata>
</entity-mappings
于 2015-09-02T08:16:17.913 回答