使Hibernate @ManyToOne关联成为Scala Option类型

时间:2012-04-10 22:34:51

标签: hibernate scala

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

感谢。

编辑: 谢谢你的建议。经过进一步思考后,我已经开始使用私有变量,并使用scala getters / setter公开它们,返回Option [MyType]。像这样:

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
}

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

- 安德烈亚斯

1 个答案:

答案 0 :(得分:1)

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

这样做意味着你可能需要放弃一些事情:

  1. “......任意对象......”你不能在Hibernate中对完全任意的类进行@ManyToOne引用。它需要是特定的Hibernate实体或实体层次结构:即DomainObject,否则Hibernate无法知道在提取时查询哪些表。
  2. “... null values ...”Hibernate为Elements做了一些特殊的东西(又名@Embeddable)。特别是,如果Element只包含空引用,则对Element本身的引用为null。
  3. 所以你可以采用这种方法,但你最终会得到一个你可能不想要的基类,而Element类中的一些无关字段只是为了确保Element本身不为null。有点痛苦。

    相反,我建议完全保留你的Option类不受Hibernate的影响。在具有选项的实体中,使用access type setting以便Hibernate通过字段访问成员,而不是方法。像这样实现getter:

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

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

    这里唯一的问题是,getter必须做一些真正的工作而不是简单的POJO方法。但是我认为不值得在结中扭曲Hibernate是值得的。

    希望有所帮助。