将Hibernate@manytone关联设置为Scala选项类型

将Hibernate@manytone关联设置为Scala选项类型,hibernate,scala,Hibernate,Scala,有人举过在Hibernate中为@manytone关联使用包装器对象(如Scala的选项)的例子吗 谢谢 编辑: 谢谢你的建议。经过进一步思考,我开始使用私有变量,并将它们公开为scala getter/setter,它返回选项[MyType]。像这样: class EmailFolder(__parent: Option[EmailFolder] = None) { //.... default constructor etc... @ManyToOne(fetch = F

有人举过在Hibernate中为@manytone关联使用包装器对象(如Scala的选项)的例子吗

谢谢

编辑: 谢谢你的建议。经过进一步思考,我开始使用私有变量,并将它们公开为scala getter/setter,它返回选项[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
}
这是可行的,我不再需要在应用程序中使用null

--
Andreas

我最初的想法是创建一个类,将其称为
选项
,将其标记为
@可嵌入的
,然后为您可能要引用的对象集提供一个公共基类的引用(称之为
域对象

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

  • “…任意对象…”您不能在Hibernate中对完全任意的类进行
    @manytone
    引用。它需要是一个特定的Hibernate实体或实体层次结构:即,
    DomainObject
    ,否则Hibernate无法知道在获取时要查询哪些表
  • “…null values…”Hibernate对元素做了一些特殊的处理(aka
    @embeddeble
    )。特别是,如果元素只包含null引用,那么对元素本身的引用就是null
  • 因此,可以采用这种方法,但最终会得到一个可能不需要的基类,以及元素类中的一些无关字段,以确保元素本身不为null。有点痛

    相反,我建议将选项类完全排除在Hibernate之外。在具有选项的实体中,使用,以便Hibernate通过字段而不是方法访问成员。实现getter,如下所示:

    ...
    @ManyToOne
    private MyObjectType myObjectReference;
    
    public Option<MyObjectType> getMyObject() {
        return new Option(this.myObjectReference);
    }
    ...
    
    。。。
    @许多酮
    私有MyObjectType myObjectReference;
    公共选项getMyObject(){
    返回新选项(this.myObjectReference);
    }
    ...
    
    另一个选项是不进行字段级访问,而是使用内部私有getter/setter(用于Hibernate)来处理字段,以及公共getter/setter(用于将字段封装在一个选项中以供应用程序的其余部分查看)

    这里唯一的缺点是getter必须做一些实际的工作,而不是简单的POJO方法。但我认为不把冬眠搞得乱七八糟是值得的


    希望这能有所帮助。

    我不是一个Scala爱好者,但从选项来看,您可能会尝试获得两种类型中的一种:空值与非空值(无值与某些值)或多种类型中的一种。这是哪一个?关键是@ManyToOne关系是可选的,我不想为该关联传递空值,但想使用一个选项传递一些(MyObject)或无,以确定DB值是否为空,使用自定义Hibernate用户类型来执行到/从选项(部分或无)的转换。您正在包装的类是否有一个公共基类,而不是Object或其他Java内置类?我想包装任意对象,这些对象可能用作选项中的@manytone关联,这样我就不会传递-值。另外,还要使
    myObjectReference
    私有
    @ericacm足够公平。添加了该字段以明确它是私有的。