3

任何人都有一个在 Hibernate 中为 @ManyToOne 关联使用包装对象的示例,例如 Scala 的 Option?

谢谢。

编辑:感谢您的建议。经过进一步思考,我决定使用私有变量并公开它们具有返回 Option [MyType] 的 scala getter/setter。像这样:

class EmailFolder(__parent: Option[EmailFolder] = None) {

    //.... default constructor etc...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private[this] var _parent: EmailFolder = __parent.orNull
    def parent = Option(_parent)
    def parent_=(newVal:Option[EmailFolder]) = _parent = newVal.orNull
}

这行得通,我不再需要在我的应用程序中使用空值。

——安德烈亚斯

4

1 回答 1

1

我最初的想法是创建一个类,调用它Option,将它标记为一个@Embeddable,然后给它一个对您可能想要引用的对象集的公共基类的引用(调用它DomainObject)。

但是,这样做意味着您可能需要放弃一些事情:

  1. “...任意对象...” 您不能@ManyToOne在 Hibernate 中引用完全任意的类。它需要针对特定​​的 Hibernate 实体或实体层次结构:即DomainObject,否则 Hibernate 无法知道在获取时要查询哪些表。
  2. “......空值......” Hibernate 为 Elements(又名@Embeddable)做了一些特殊的事情。特别是,如果 Element 仅包含 null 引用,则对 Element 本身的引用为 null。

所以你可以采用这种方法,但你最终会得到一个你可能不想要的基类,以及 Element 类中的一些无关字段,只是为了确保 Element 本身不为空。有点痛。

相反,我建议您将 Option 类完全排除在 Hibernate 之外。在具有选项的实体中,使用访问类型设置,以便 Hibernate 通过字段而不是方法访问​​成员。像这样实现getter:

...
@ManyToOne
private MyObjectType myObjectReference;

public Option<MyObjectType> getMyObject() {
    return new Option(this.myObjectReference);
}
...

另一种选择是不进行字段级访问,而是使用内部私有 getter/setter 供 Hibernate 处理字段,以及将其包装在 Option 中的公共 getter/setter 以供应用程序的其余部分查看。

这里唯一的缺点是 getter 必须做一些实际的工作,而不是一个简单的 POJO 方法。但我认为不将 Hibernate 打结是值得的。

希望有帮助。

于 2012-04-16T03:47:01.660 回答