我正在将使用 xdoclet 的旧应用程序迁移到带有注释的 Hibernate 4。我在将“hibernate.properties”xdoclet 标记(生成为<properties unique="false".../>;
in .hbm.xml
)转换为等效注释时遇到问题。基于 Hibernate 的 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;
}
}
然后在另一个实体中使用“b_plus_c_group”来表达对 ClassA 的连接,使用 b 和 c 作为键:
/**
* @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 的实现不存在测试环境,因此我无法轻松运行场景来查看这些查询的实际行为。此时我依赖于手动观察。)
我对这里的用法的总结是:我们有一对属性“b”和“c”,它们一起形成了 A 的非唯一键(unique="false" 是默认值)。所以我们给这对属性命名为“b_plus_c_group”并使用它:
- 作为从另一个实体到 A 的多对一关系的关键
- 但是一对非唯一的密钥如何可靠地产生多对一所需的单一结果呢?包含由COL_B和COL_C 组成的公式会起到什么额外的作用?
- 作为获取组中的字段以表达查询的限制和投影的一种方式。
- 但是这些不能简单地表示为“ab”和“ac”吗?
因此,我有两种用法在我看来是错误的(但我可能会遗漏一些东西),并且无法将它们逐字翻译成注释。
任何人都可以澄清预期的行为并提供一种表达为注释的方法吗?