使休眠@ManyToOne关联成为 Scala Option 类型



有人有使用包装对象的例子,如Scala的选项,在Hibernate中@ManyToOne关联吗?

谢谢。

编辑:感谢您的建议。经过进一步的思考,我已经决定使用私有变量并公开它们具有返回 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
}

这有效,我不再需要在我的应用程序中使用空值。

--安德烈亚斯

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

这样做意味着您可能需要放弃几件事:

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

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

相反,我建议让你的Option类完全远离Hibernate。 在具有选项的实体中,使用访问类型设置,以便 Hibernate 通过字段而不是方法访问成员。 像这样实现吸气剂:

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

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

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

希望有帮助。

最新更新