Как смоделировать это с JPA? - PullRequest
1 голос
/ 14 июня 2011

Я хочу смоделировать пару объектных отношений, и в настоящее время я не уверен в разумном способе сделать это. Давайте предположим, что 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;
...