冬眠多态性
这是一个Hibnerate多态性问题和一个数据模型设计问题;它们是交织在一起的。我过去使用过Hibernate,并且喜欢它,但有时我发现除了琐碎的设计之外,很难考虑任何事情。不是对冬眠的敲门声;只是一个观察,ORM总体上可能具有挑战性。
我认为这是一个Hibernate 101问题,但我不确定。我试图实现的目标甚至可能是不可能的。
我有一个抽象类水果,将被子类为苹果和橙子。我有一个Note类,表示有关Apples和Oranges的注释或注释。一个苹果或橙子可以有许多与之关联的Notes,但只有一个Apple或Orange会与给定的Note相关联。
以下是这些类的草图,我现在省略了对象id的位置,以及将它们与橙子区分开来的Apples的属性。目前,我对使用哪种Hibernate继承策略没有强烈的感觉。
abstract public class Fruit {
}
// Apples have notes written about them:
public class Apple extends Fruit {
private Set<Note> note;
...
@OneToMany(cascade = CascadeType.ALL)
public Set<Note> getNote() {
return note;
}
}
// Oranges have notes written about them:
public class Orange extends Fruit {
private Set<Note> note;
...
@OneToMany(cascade = CascadeType.ALL)
public Set<Note> getNote() {
return note;
}
}
下面是当前实现的 Note 类,其中我们看到它具有 Apple 和 Orange 的字段。这种设计的缺陷或不优雅之处在于,单个笔记实例只会指向Apple或Orange之一,而永远不会同时指向两者。因此,如果将Note绑定到Apple上,则橙色字段是多余的,不雅观的,反之亦然。
// A note about an Apple or Orange
public class Note {
private String theNote;
private Apple apple;
private Orange orange;
...
// with the usual many to one mapping
@ManyToOne
@JoinColumn(name = "apple_id")
public Apple getApple() {
return apple;
}
// with the usual many to one mapping
@ManyToOne
@JoinColumn(name = "orange_id")
public Orange getOrange() {
return orange;
}
...
}
但是,这是我认为我想要基于我的设计基础的Note类,但我不确定如何考虑Hibernate注释和表映射:
// A note about a fruit:
public class Note {
private String theNote;
private Fruit fruit;
...
}
因此,水果将是苹果或橙子的实例。
后一个Note类,它引用了水果,实际上将容纳一个苹果或橙子,甚至可以与Hibernate ORM映射相协调吗?如果是,有人可以谈谈如何。