1

我正在将使用 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”并使用它:

  1. 作为从另一个实体到 A 的多对一关系的关键
    • 但是一对非唯一的密钥如何可靠地产生多对一所需的单一结果呢?包含由COL_BCOL_C 组成的公式会起到什么额外的作用?
  2. 作为获取组中的字段以表达查询的限制和投影的一种方式。
    • 但是这些不能简单地表示为“ab”和“ac”吗?

因此,我有两种用法在我看来是错误的(但我可能会遗漏一些东西),并且无法将它们逐字翻译成注释。

任何人都可以澄清预期的行为并提供一种表达为注释的方法吗?

4

0 回答 0