2012-04-10 69 views
3

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

谢谢。

编辑: 感谢您的建议。经过进一步的思考,我已经开始使用私有变量并公开他们拥有返回Option [MyType]的scala getters/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 
} 

这个工作,我不再需要在我的应用程序中使用空值。

- 安德烈亚斯

+0

我不是一个斯卡拉的家伙,但看着选项,似乎你可能会试图得到以下两件事之一:空vs非空感(无VS一些)或许多类型的东西之一。这是什么? – sharakan 2012-04-11 13:14:15

+0

问题是,@ManyToOne关系是可选的,我不想为该关联传递null值,但想要使用Option来传递Some(MyObject)或None,以确定DB值是否为null或者不使用自定义Hibernate用户类型来执行到/从选项(一些或无)的转换。 – andreak 2012-04-11 17:43:28

+0

包装的类是否具有除Object或其他Java内置类之外的通用基类? – sharakan 2012-04-11 20:03:33

回答

1

我最初想到这里是使一类,称之为Option,其标记为@Embeddable,然后给它一个共同的基类的引用了一组你可能想的对象(称为DomainObject)。

这样做虽然意味着你可能需要放弃一两件事情:

  1. “......任意对象......”你不能有一个@ManyToOne参考休眠完全任意类。它需要是一个特定的Hibernate实体或实体层次结构:即DomainObject,否则Hibernate无法知道在提取时要查询哪些表。
  2. “......空值...”Hibernate为元素(又名@Embeddable)做了一些特殊的事情。特别是,如果元素只包含空引用,那么对元素本身的引用就是null。

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

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

... 
@ManyToOne 
private MyObjectType myObjectReference; 

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

另一个选择是不做字段级的访问,而是有内在的,私人的getter/setter的休眠处理领域,公有的getter/setter方法是把它包装为您的应用程序的其余部分查看选项。

只有在这里,getter必须做一些真正的工作,而不是一个简单的POJO方法。但是我认为不值得用扭曲的方式来扭曲休眠。

希望有所帮助。

+0

也使'myObjectReference''专用'。 – sourcedelica 2012-04-16 12:13:55

+0

@ericacm够公平的。添加了该字段以清除它的私密性。 – sharakan 2012-04-17 13:23:08