hibernate映射“规则”

时间:2011-09-09 19:19:41

标签: java hibernate

是否可以与属性进行一对一映射,而不是使用主键?基本上,我想要做的是在我的“父”类中拥有一个属性,该类只根据一些规则对其中一个子进行一次引用。例如,它可能是“最后添加的孩子”。我知道这对查询来说相当简单,但是有可能拥有“智能”属性吗?所以除了.load(Parent.class,pk)之外你不必编写任何东西,然后从那里开始使用实例。

同样的问题适用于一对多关系,是否也可以为此应用规则?最后,是否可以将这些规则与参数集成到getmethod?

所以你可以有一个getChildren(from,to)ish方法:)

2 个答案:

答案 0 :(得分:1)

我会尝试使用formula属性。这将允许您使用SQL,列或其他表达式定义更复杂的映射。当我回到家时,我将不得不更多地研究这个问题,但这里有一些例子和文章让你开始。显然,源代码也有org.hibernate.test.onetooneformula

的示例

Many-to-One Formula Forum Post

O'Reilly Hibernate 3 Formulas Article

Hibernate Example Mappings

答案 1 :(得分:0)

Hibernate实体是Java对象。没有什么可以阻止你将逻辑写入这些对象。实际上如果你这样做是件好事。你可以这样:

@Entity
public class Parent {
    ...
    @OneToMany
    private Set<Child> children;
    ...

    public Set<Child> getChildren() {
        if (children == null) {
            children = new HashSet<Child>();
        }

        return children;
    }

    public Child getLastAddedChild() {
        for(Child child: getChildren()) {
            ... logic ...
        }
        return lastAddedChild;
    }
}

请注意,此实现未进行优化,仅作为示例。但你可以做各种各样的事情,比如拥有一个@Transient字段来保存最后添加的子节点(在getLastAddedChild()方法中使用延迟初始化),或者隐藏你的集合并使用一种方法将子节点添加到你的对象等。

正如我所说,hibernate实体是对象。在良好的OO设计中,真实对象具有与之相关的行为。我建议你对DDD(领域驱动设计)做一些研究。