我正在使用xdoclet将旧应用程序迁移到带有注释的Hibernate 4。我在翻译&#34; hibernate.properties&#34;时遇到了问题。 xdoclet标记(在<properties unique="false".../>;
中生成.hbm.xml
)到等效注释。 Based on Hibernate's JIRA,看起来在创建Hibernate注释时从未创建@Properties
注释,并且仍然在Hibernate 5中作为可能的增强进行仔细研究。
以下是应用程序使用<properties>
的方式。属性组的设置如下:
/**
* @hibernate.class table="ENTITY_A" dynamic-update="true" dynamic-insert="true"
* @hibernate.properties name="b_plus_c_group"
*/
public class ClassA {
private ClassB b;
private ClassC c;
...
/**
* @hibernate.many-to-one
* column="COL_B"
* class="com.acme.ClassB"
* cascade="none"
* properties-name="b_plus_c_group"
*/
ClassB getB() {
return b;
}
/**
* @hibernate.many-to-one
* column="COL_C"
* class="com.acme.ClassC"
* cascade="none"
* properties-name="b_plus_c_group"
*/
ClassC getC() {
return c;
}
}
&#34; b_plus_c_group&#34;然后在另一个实体中使用b和c表示与ClassA的连接:
/**
* @hibernate.many-to-one
* property-ref="b_plus_c_group"
* insert="false"
* update="false"
* cascade="all"
* fetch = "join"
* class="com.acme.ClassA"
* @hibernate.formula value="COL_B"
* @hibernate.formula value="COL_C"
*/
ClassA getA() {
return a;
}
在构建Criteria查询时,某些业务逻辑也会引用属性组:
Criteria criteria = session.createCriteria(ClassA.class, "a");
criteria
.createAlias("b_plus_c_group", "bpc")
.createAlias("bpc.b", "b")
.createAlias("bpc.c", "c")
.add(Restrictions.eq("c.keyField", keyForC))
.setProjection(
Projections.projectionList()
.add(Projections.property("a.description"))
.add(Projections.property("b.description")));
(注意:遗憾的是,目前正在生产的基于xdoclet的实现不存在测试环境,因此我无法轻松运行方案来查看这些查询的实际行为。此时我还是取决于人工观察。)
我在这里的用法总结是:我们有一对属性&#34; b&#34;和&#34; c&#34;它们共同形成A的非唯一键(唯一=&#34; false&#34;是默认值)。所以我们给这对属性命名为&#34; b_plus_c_group&#34;并使用它:
所以我有两个看起来对我不好的用法(但我可能会遗漏一些东西),并且无法将这些用法逐字翻译成注释。
任何人都可以澄清预期的行为并提供表达注释的方式吗?