【问题标题】:Problem with reverse engineering a many-to-one unidirectional association with hibernate tools逆向工程与休眠工具的多对一单向关联的问题
【发布时间】:2011-07-11 22:36:16
【问题描述】:


我在 Eclipse (Helios) 中使用 Hibernate 工具 3.40。 我正在尝试使用 EJB3 样式(即 JPA2.0 注释)从我的数据库(MSSQL 2008)生成 POJO。
假设我有两个表AB,其中有一个从AB 的外键。
默认情况下,这会为A 生成一个 POJO,其中 B 作为成员(其“父级”)和B 的 POJO,其中有一个 Set<A> 作为成员(其“子级”)。 我想知道如何控制 rev-eng 以便只创建关联的一侧(我有不同的用例,所以基本上所有三个选项对我来说都很重要)。
我不想使用 hbm.xml 文件,因为我正在使用注释和 JPA2.0,但我可以在逆向工程过程中指定一些元数据以通过 hibernae.reveng.xml 休眠

我已经尝试配置foreign-key 属性并在那里定义exclude=true,但这只为我提供了一种情况的一半答案。这生成了一个带有 bPK int 成员的A POJO,这是可以容忍和可以理解的但是生成的B POJO 现在无法编译,因为one-to-many 注释具有无效属性; mappedby="unresolved" 是因为 A 不再具有 hibernate reveng 可以映射回的属性。

所以,我目前无法创建单向关联,如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: java hibernate jpa reverse-engineering hibernate-tools


    【解决方案1】:

    Hibernate Code Generation Configurationreveng. strategy 创建一个类

    例子:

    public class MyReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy {
    
       public MyReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) {
           super(delegate);
       }
    
       @Override
       public void setSettings(ReverseEngineeringSettings settings) {
           super.setSettings(settings);
       }
    
       @Override
       public boolean excludeForeignKeyAsCollection(String keyname, 
        TableIdentifier fromTable, java.util.List fromColumns, 
        TableIdentifier referencedTable, java.util.List referencedColumns) {
    
        // TODO : Your work here
        if (keyname.equals("___") && 
            fromTable.getName().equals("___") && 
            fromColumns.contains("___") && 
            referencedTable.getName().equals("___") && 
            referencedColumns.contains("___")) {
    
            return true;
        }
    
        return false;
       }
    }
    

    方法excludeForeignKeyAsCollection的JavaDoc

    Should this foreignkey be excluded as a oneToMany 
    

    还有另一个方法调用excludeForeignKeyAsManytoOne

    Should this foreignkey be excluded as a many-to-one 
    

    【讨论】:

    • 非常感谢。我希望有更好的方法来做到这一点,而不是在那个“晦涩”的类中硬编码这些要求,但至少这是一个可行的解决方案。
    • 我也有同样的问题,但是你的回答是针对“___”的,不是一般的回答。还是谢谢
    【解决方案2】:

    目前(使用 Hibernate Tools 5.2 测试),生成单向多对一作品。

    在文档 (https://docs.jboss.org/tools/4.0.0.Final/en/hibernatetools/html_single/index.html#hibernaterevengxmlfile) 中,您可以看到可以排除关系的某些方面:

    例如(重命名属性)

     <!-- control many-to-one and set names for a specific named foreign key constraint -->
     <foreign-key constraint-name="ORDER_CUST">
       <many-to-one property="customer"/>
       <set property="orders"/>
     </foreign-key>
    

    或(不包括属性)

     <!-- can also control a pure (shared pk) one-to-one  -->
      <foreign-key constraint-name="ADDRESS_PERSON">
       <one-to-one exclude="false"/>
       <inverse-one-to-one exclude="true"/>
      </foreign-key>
    

    因此,如果只与@ManyToOne 建立关系的一侧,您可以执行以下操作:

    <table name="city" schema="public">
        <primary-key property="id">
            <key-column name="id" type="integer"/>
        </primary-key>
    </table>
    
    <table name="country" schema="public">
        <foreign-key constraint-name="country_capital_fkey" foreign-schema="public">
            <many-to-one property="capital" exclude="false"/>
            <set exclude="true" />
        </foreign-key>
    </table>
    

    您还可以在此处使用 Docker 获取我的示例数据库的实例:

    docker pull ghusta/postgres-world-db:2.1

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 2010-12-24
      • 1970-01-01
      • 2014-08-10
      • 2013-12-03
      • 2012-10-27
      • 2011-08-08
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多