2014-01-28 5 views
0

У меня есть вопрос, что я не уверен, что его можно с JPAJPA - присоединяйся различными таблицы зависит от типа столбца

если я скажу таблица А

public class A { 
    Long id; 
    Long type; 
    Details details; // can this connect to B or c depends on type? 
} 

и таблицы B и C являются две разные таблицы подробностей. (не уверены, что-то общее) Могу ли я подключить B или C к A, зависит от A.type?

благодаря

Alon

EDIT: позвольте мне попытаться быть более точным

У меня есть объект

@Entity  
@Table(name = "tbl_A") 
public class A implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@Id 
private Long id; // seems like spring's jpa has issue hanlde "_" 

    /* 
    *can i achive some thinglike 
    * if detailsTableType== 1 use Details as B table 
    */ 


    @OneToOne(mappedBy = "details", cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private B details; 

    /* 
    *can i achive some thinglike 
    * if detailsTableType== 2 use Details as C table 
    */ 

    @OneToOne(mappedBy = "details", cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private C details; //Details 

    /* 
     * this field set the from where the join should be 
     */ 

    private Long detailsTableType; 

} 

Примечание B, C не обязательно делиться любой в общем

EDIT 2:

одним из возможных решений может быть какой-то взломать с помощью геттера. что означает: карта в A все возможное соединение (отметьте их как ленивые) и создайте геттер, который будет знать, зависит от типа, который должен использовать его.

+0

В действительности у вас есть иерархия классов с несколькими подклассами 'A'. Один тип 'A' имеет объект детали« B », а другой - объект детали« C ». Это похоже на комбинацию спящего режима для подкласса Table-per-subclass и table-per-class-hierarchy. См. Http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/inheritance.html#inheritance-mixing-tableperclass-tablepersubclass –

ответ

2

Я предполагаю, что вы хотите добавить некоторые детали в экземпляр A с наследованием классов B и C класса A. Я рекомендую вам прочитать документацию о значении/столбце наследования и дискриминатора.

На документации hibernate вы увидите, как - использовать концепцию наследования и стратегии TABLE_PER_CLASS - и описать столбец descriminator (ваш тип столбца)

Edit: но я Recommand вас для использования другой стратегии, такой как SINGLE_TABLE_PER_CLASS. Обратите внимание, что провайдер JPA не должен поддерживать стратегию TABLE_PER_CLASS, а также этот конкретный startegy имеет последствия для производительности.

* Second Edit: * Хорошо: я предлагаю вам использовать полиморфизм для классов B и C, потому что они используют что-то общее => ссылку с базовым классом A!

Вы могли бы:

Class A 
* Member list of DetailsItf 

и

DetailItf (interface) 
| 
AbstractDetail (SINGLE_TABLE_PER_CLASS strategy with discriminator colum ou TABLE_PER_CLASS) implements DetailItf 
| 
|-B inherits from Details 
|-C inherits from Details 

Затем вы должны использовать AbstractDetail класс в вашей базе класс как:

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(targetEntity=foo.pck.AbstractDetail.class) 
private List<DetailsItf> details = new ArrayList<DetailItf>(); 

И на использовании, вы должен составить

B myB = new B(); 
// saving myB entity 
A myA = new A(); 
myA.addDetails(myB); 
// saving myA 

Вы также должны указать конкретный queriez, основываясь на специфических ключевых словах TYPE() JPQL или, используя FROM CLASS в jpql, но вам нужно создать доказательство концепции и проверить эффективность.

+0

У меня есть мой вопрос, чтобы быть точнее – oak

+0

спасибо! я попробую – oak

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