有人有使用包装对象的例子,如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
)。
这样做意味着您可能需要放弃几件事:
- "...任意对象..." 您不能在 Hibernate 中对完全任意类进行
@ManyToOne
引用。 它需要到特定的Hibernate实体或实体层次结构:即DomainObject
,否则Hibernate无法知道在获取时要查询哪些表。 - "...空值..."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方法。 但我认为不让休眠打结是值得的。
希望有帮助。