2011-03-09 44 views
5


我在Eclipse(Helios)中使用Hibernate工具3.40。 我试图用我的数据库(MSSQL 2008)和EJB3风格(即JPA2.0注释)生成POJO。
比方说,我有两个表AB那里是一个外键从AB
默认情况下,它会生成一个A的POJO,其中B作为成员(其“父级”),POJO为B,其Set<A>作为成员(其“子级”)。
我想是知道我怎么能控制转-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可映射回的属性。

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

回答

3

Hibernate Code Generation Configuration

实施例创建reveng. 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

Should this foreignkey be excluded as a oneToMany 

的JavaDoc和有也有另一种方法,呼叫excludeForeignKeyAsManytoOne

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

非常感谢。我希望有一个更好的方法来做到这一点,而不是在这个“晦涩”的类中对这些需求进行硬编码,但至少这是一个可行的解决方案。 – Ittai

+0

我有同样的问题,但你的答案是“___”的具体情况,这不是一般的答案。不管怎么说,还是要谢谢你 – Kummo

0

目前(与Hibernate工具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> 

您还可以在这里泊坞窗取我的样本数据库的实例:

搬运工拉ghusta/Postgres的世界-DB:2.1