2015-02-20 4 views
0

У меня проблема с использованием JPA.Atypic JPA OneToOne отношение

меня к таблицам:

----------------- 
| TableA  | 
|---------------| 
| ID: INT  | 
| ...   | 
| ESTATUS1: INT | 
| ESTATUS2: INT | 
----------------- 

----------------- 
| EstatusTags | 
|---------------| 
| COD: VARCHAR |---> COD and VALUE are a concatenated PK 
| VALUE: INT | 
| DESC: VARCHAR | 
----------------- 

EstatusTags представляет собой таблицу для хранения множества пар [VALUE, DESC], учитывая ХПК.

Перед тем, как использовать JPA, я использовал для запроса такого рода данных, в чем-то вроде этого:

SELECT ID, ESTATUS1, ESTATUS2, E1.DESC DESC1, E2.DESC DESC2 
FROM TABLEA A 
    INNER JOIN ESTATUSTAGS E1 ON E1.COD = "a_estatus1" 
     AND E1.VALUE = A.ESTATUS1 
    INNER JOIN ESTATUSTAGS E2 ON E2.COD = "a_estatus2" 
     AND E2.VALUE = A.ESTATUS2 

Я пытаюсь использовать JPA моделировать это с помощью двух классов сущностей:

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

    @EmbeddedId 
    private ValueTagPK id; 

    @Column(name="VVA_DESC") 
    private String desc; 

    @Column(name="VVA_ORDEN") 
    private Integer orden; 
} 

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

    @Column(name="ID") 
    private String desc; 

    @OneToOne(???) 
    private EstatusTag estatus1; 

    @OneToOne(???) 
    private EstatusTag estatus2; 
} 

У меня есть серьезные сомнения в том, как моделировать отношения. Можно ли это сделать с аннотациями? Необходимо ли использовать JPQL для этой структуры?

Я надеюсь, что кто-то может помочь мне в этом.

Большое спасибо.

+0

В классе 'A'' desc' строка передается в столбец 'ID', который согласно вашей таблице является целым числом. Это не имеет смысла. В таблице идентификатор 'A' является первичным ключом? Также класс 'A' ссылается на' EstatusTag', где, поскольку ваш класс называется 'EstatusTags' – andih

ответ

0

Проблема в том, что модель объекта не соответствует структуре таблицы. В модели объекта у вас есть один на один отношения корабль между A и EstatusTag в то время как в вашей модели таблицы вы имеете отношение одного A и нескольких Estatustags (для одного value может существовать несколько записей Etatustags)

вы преодолеваете проблема, что в таблице A нет столбца cod, добавив что-то вроде виртуального cod столбца E1.COD = "a_estatus1" в ваш SQL-запрос.

Что вы можете сделать, так это сопоставление столбца value двух свойств EstatusTag один раз с композитным pk, а в другое время - с одним свойством следующим образом. Простой value сделан доступным через доступ к свойствам, но помечен как не обновляемый, не вставляемый также сеттер на самом деле не работает и сделан private.
Примечание: Я не знаю, работает ли это со всеми реализациями JPA - Протестировано спящим 4.3.8.

@Entity 
@Table(name = "EstatusTags") 
@Access(AccessType.FIELD) 
public class EstatusTag implements Serializable{ 


    private @EmbeddedId ValueTagPK id; 

    @Column(name="VVA_DESC") 
    private String desc; 

    @Column(name="VVA_ORDEN") 
    private Integer orden; 



    @Column(name="value", updatable=false, insertable=false) 
    @Access(AccessType.PROPERTY) 
    public int getValue() { 
     return id.value; 
    } 

    private void setValue(int value) { 
     // only because otherwise hibernate complains about a missing setter. 
    } 

} 

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


    @Id 
    @Column(name="ID") 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private int id; 

    @OneToOne() 
    @JoinColumn(name="estatus1",referencedColumnName="value") 
    public EstatusTag estatus1; 

    @OneToOne() 
    @JoinColumn(name="estatus2",referencedColumnName="value") 
    public EstatusTag estatus2; 


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