Я хочу смоделировать пару объектных отношений, и в настоящее время я не уверен в разумном способе сделать это. Давайте предположим, что Record
имеет отношение OneToMany к различным источникам записи. Общими атрибутами RecordSources
являются long id
и boolean preferred
. Другие атрибуты индивидуальны, и количество источников записей может увеличиться в будущем.
Одна возможность для Record
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="record")
private List<GenericSimpleRecordSource> recordSources;
где GenericSimpleRecordSource
будет выглядеть так:
@Entity
public class GenericSimpleRecordSource implements Serializable
{
public static enum Type {a,b}
@ManyToOne private Record record;
@NotNull
private Type sourceType;
@OneToOne(cascade = CascadeType.ALL,mappedBy="source")
private SimpleRecordSourceA sourceA;
@OneToOne(cascade = CascadeType.ALL,mappedBy="source")
private SimpleRecordSourceB sourceB;
}
SimpleRecordSourceA
и SimpleRecordSourceA
являются отдельными @Entity
классами. Я не чувствую себя комфортно при таком подходе, лучше использовать наследование:
@Entity
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name="type")
@DiscriminatorValue("generic")
public class GenericRecordSource
{
@Id @GeneratedValue(strategy=GenerationType.AUTO) private long id;
@ManyToOne private Record record;
private boolean preferred;
}
@Entity
@DiscriminatorValue("A")
public class RecordSourceA extends GenericRecordSource
{
...
}
@Entity
@DiscriminatorValue("B")
public class RecordSourceB extends GenericRecordSource
{
...
}
Кажется, это умнее, но есть ли недостатки в использовании Inheritance? Я ценю любые комментарии по обоим подходам или даже другую альтернативу.
Можно ли смоделировать отношение @OneToMany
из Record
следующим образом?
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="record")
private List<GenericRecordSource> recordSources;