Это вопрос полиморфизма Гибнера и дизайн модели данных вопрос; они переплетены. Я использовал Hibernate в прошлом, и наслаждались им, но иногда мне трудно думать ничего, кроме тривиальных конструкций. Не стук в спящий режим; просто что ОРМ вообще может быть сложным.
Я думаю, что это вопрос Hibernate 101, но я не уверен. То, что я пытаюсь достичь, возможно даже не возможно.
У меня есть абстрактный класс Fruit, который будет подклассифицирован в Apple и оранжевый. У меня есть класс Note, который представляет заметки или комментарии о яблоках и апельсинах. Apple или Orange могут иметь много Notes связанных с ним, но только один Apple или Orange когда-либо будут связанные с данным примечанием.
Вот эскизы классов, где я пока что не указываю, где объект id go и свойства яблок, которые различают их из Апельсинов. В настоящее время я не чувствую решимости о том, какую стратегию наследования 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, и оба они оба. Поэтому, если примечание привязано к 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;
...
}
после чего фрукты будут либо экземпляром Apple, либо апельсином.
Может ли этот последний класс Note со ссылкой на Fruit, который фактически будет содержать Apple или Orange, даже примирится с Hibernate ORM mapping? Если да, может кто-нибудь, пожалуйста, поговорите о том, как.