有人有一个在 Hibernate 中使用包装对象(例如 Scala 的 Option)来实现 @ManyToOne 关联的示例吗?
谢谢。
编辑: 感谢您的建议。经过进一步思考,我决定使用私有(private)变量,并将它们暴露为具有返回 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
}
这有效,我不再需要在我的应用程序中使用 null。
-- 安德烈亚斯
最佳答案
我最初的想法是创建一个类,将其命名为 Option
,将其标记为 @Embeddable
,然后为其提供对公共(public)基类的引用您可能想要引用的一组对象(将其称为 DomainObject
)。
这样做意味着您可能需要放弃一些东西:
- “...任意对象...” 在 Hibernate 中,您不能拥有对完全任意类的
@ManyToOne
引用。它需要是特定的 Hibernate 实体或实体层次结构:即DomainObject
,否则 Hibernate 无法知道在获取时要查询哪些表。 - “...空值...” Hibernate 为 Elements 做了一些特殊的事情(又名
@Embeddable
)。特别是,如果 Element 仅包含 null 引用,则对 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);
}
...
另一个选择是不进行字段级访问,而是使用 Hibernate 的内部私有(private) getter/setter 来处理字段,以及将其包装在 Option 中的公共(public) getter/setter 供应用程序的其余部分查看.
这里唯一的缺点是 getter 必须做一些实际的工作,而不是一个简单的 POJO 方法。但我认为不让 Hibernate 陷入困境是值得的。
希望有帮助。
关于hibernate - 使 Hibernate @ManyToOne 关联成为 Scala Option 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097430/