2014-02-05 4 views
0

На высоком уровне у меня есть класс «MainClass», который имеет список «OtherEntity». Существуют, по существу, две таблицы соединений. В двух таблицах объединения есть метаданные в них, которые используют другие компоненты, но я не определил сущности, так как мы не нуждаемся в них за пределами операции объединения. Но в основном MainClass => TableOne => TableTwo => OtherEntityКак я могу использовать отношения OneToMany в JPA с несколькими таблицами между ними?

Моя сущность определений

@Entity 
public class MainClass { 

    // other stuff ... 

    // how to? 
    @OneToMany 
    private List<OtherEntity> otherEntities; 
} 


@Entity 
public class OtherClass { // other stuff ... } 

Моя схема (наследство и не могут быть изменены)

table MainClass 
    PK id 
    ... 

table TableOne 
    PK id 
    FK main_class_id 
    FK table_two_id 

table TableTwo 
    PK id 
    FK table_one_id 
    FK other_entity_id 

table OtherEntity 
    PK id 
    ... 

Я хотел бы избежать создания объектов для TableOne и TableTwo, если можно.

ответ

0

Проблема - проблема дизайна, которая в конечном итоге будет решена. У нас есть представление базы данных, которое обеспечивает единую таблицу поиска. В слое базы данных мы можем назначать отдельные части.

@Entity 
public class MainClass { 

    @OneToMany 
    @JoinTable(name = "TheViewName", 
     joinColumns = @JoinColumn(name = "id", insertable = false, updatable= false), 
     inverseJoinColumns = @JoinColumn(name = "other_id", insertable = false, 
      updatable = false)) 
    private List<OtherEntity> otherEntities; 
} 

Это означает, что я не могу назначить новое другое лицо для MainClass и сохранить оба. Я должен сделать две отдельные операции, чтобы довести до конца. Но это исчезнет, ​​когда мы реорганизуем схему.

В качестве альтернативы мы могли бы создавать сущности для двух других таблиц, чтобы сделать операции более прозрачными.

1

Рассмотрите возможность использования @SecondaryTable, он должен работать для устаревших схем, используя эту аннотацию, вы можете иметь поля в одном объекте и просто определять, какие из них будут составлять часть другой таблицы, но у вас есть только 2 объекта.

Проверить this учебник

Идеи расщепляется полей из одного объекта в разных таблицах, не нужно создание других организаций, просто определить, какие поля в каком таблице.

@SecondaryTables{@SecondaryTable(name="XX")} 

и перемещения полей между таблицами используйте

@Column(table="XX") 

В вашей конфигурации попробовать что-то вроде этого.

@Entity 
@SecondaryTables{@SecondaryTable(name="TableOne"), @SecondaryTable(name="TableTwo")} 
table MainClass 
    PK id 
    @Column(table="TableOne") 
    FK main_class_id 
    @Column(table="TableOne") 
    FK table_two_id 

    @Column(table="TableTwo") 
    PK id 
    @Column(table="TableTwo") 
    FK table_one_id 
    @Column(table="TableTwo") 
    FK other_entity_id 

Для идентификаторов в средних таблицах подумайте об удалении @Id и установите его автоматически, он должен работать!

+0

Это интересная концепция. Однако не следует ли аннотировать @SecondaryTables в классе OtherEntity, чтобы он извлекал FK из других таблиц? – predhme

+0

Ну, нужно проверить дизайн, возможно, имеет смысл иметь два смысла на одном объекте, некоторые из них и другие в другом объекте, рассмотрите ваш дизайн, чтобы применить SecondaryTables, когда у него больше смысла его иметь. Это поможет вам рассмотреть мой ответ XD – Koitoer

+0

Я действительно ценю понимание вторичной таблицы, так как это может обеспечить использование для другой проблемы. Однако, без ведома для меня, мы имеем представление, которое обеспечивает единую таблицу. Я просто указал аннотацию joinTable на представление, и проблема решена. – predhme

Смежные вопросы