我在Eclipse(Helios)中使用Hibernate工具3.40。
我正在尝试使用EJB3样式(即JPA2.0注释)从我的数据库(MSSQL 2008)生成POJO。
假设我有两个表A
和B
,其中有一个从A
到B
的外键。
默认情况下,这会生成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>
所以,我目前无法创建单向关联,我会感激任何帮助。
答案 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