任何人都有一个使用包装对象的例子,比如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
}
这有效,我不再需要在我的应用程序中使用空值。
- 安德烈亚斯
答案 0 :(得分:1)
我最初的想法是创建一个类,将其命名为Option
,将其标记为@Embeddable
,然后为它提供对您可能想要的对象集的公共基类的引用。参考(称之为DomainObject
)。
这样做意味着你可能需要放弃一些事情:
@ManyToOne
引用。它需要是特定的Hibernate实体或实体层次结构:即DomainObject
,否则Hibernate无法知道在提取时查询哪些表。@Embeddable
)。特别是,如果Element只包含空引用,则对Element本身的引用为null。所以你可以采用这种方法,但你最终会得到一个你可能不想要的基类,而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是值得的。
希望有所帮助。