逆向工程与hibernate工具的多对一单向关联问题

时间:2011-03-09 14:07:53

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


我在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,但这只为我提供了一个场景的答案。这生成了A POJO,其中包含bPK int成员,这是可以容忍和可理解的但是生成的B POJO现在无法编译,因为one-to-many注释具有无效属性; mappedby="unresolved"由于A不再具有hibernate reveng属性的事实可以映射回来。{/ p>

所以,我目前无法创建单向关联,我会感激任何帮助。

2 个答案:

答案 0 :(得分:3)

reveng. strategy

创建Hibernate Code Generation Configuration的课程

示例:

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 

答案 1 :(得分:0)

目前(使用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