2012-02-16 2 views
0

У меня есть ошибка моих сущностей, мои таблицы:JPA автообъединение ошибку

ЯЗЫК

codLanguage (Primary Key)
nameLanguage

Устройство

idDevice(Primary Key)
nameDevice

ФРАЗА

idPhraseGroup(Primary Key)
codlanguage(Primary Key)
idDevice (Primary Key)
tex

У меня проблема с моей сущности Фраза, это:

public class Phrase implements Serializable { 

    @EmbeddedId 
    private PhraseKey idPhrase; 

    private String text; 

    //etc 
    //here my problem (*) 

    @OneToMany(mappedBy="idPhrase.idPhraseGroup",fetch=FetchType.EAGER) 
    @JoinColumn(name = "idPhrase.idPhraseGroup", updatable = false, insertable = false, referencedColumnName = "idPhrase.idPhraseGroup") 
    private List<Phrase> groupListPhrase; 
} 

@Embeddable 
public class PhraseKey implements Serializable { 

private Integer idPhraseGroup; 
private String codLanguage; 
private String idDevice; 
---getter e setter 


} 

Я вам хотелось бы получить список фраз с тем же idPhraseGroup , например, в разговорник таблице:

idPhraseGroup | codLang |idDevice | text

1 | ES | 1 | mesa

1 | EN | 1 | table

..но я получил эту ошибку:

Exception Description: An incompatible mapping has been encountered This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer

Thanxs

+0

Я пробовал это: MapsId ("idPhraseGroup") @ OneToMany private List groupListPhrase; но он не работает, он создает SELECT * FROM PHRASE_PHRASE – Jacky

+0

@MapsId ("idPhraseGroup") @OneToMany @JoinTable (имя = "ФРАЗА") частный список groupListPhrase; но у меня есть только одна фраза – Jacky

+0

Я бы хотел: SELECT * FROM PHRASE t0, PHRASE t1 WHERE (t0.idPhraseGroup = 1) И t1.idPhraseGroup = t0.idPhraseGroup AND (t1.codLanguage = t0.codLanguage) AND (t1.idDevice = t0.idDevice) – Jacky

ответ

0

Я не понимаю, почему вам нужно сопоставление или как оно может работать. Вы не можете использовать базовое поле сопоставления «idPhrase.idPhraseGroup» в mappedBy на oneToMany, потому что оно не описывает отношения. OneToMany, как правило, полагается на другую сторону, имея много назад, но в этом случае вы не делаете.

Если все, что вы хотите, это набор фраз для лиц с определенной idPhaseGroup, только запрос для него с помощью: em.createQuery («выбрать р от фазы р, где p.idPhrase.idPhraseGroup =: phaseGroup»). SetParameter («phaseGroup», phaseGroupId);

Я бы удалил отображение, если вам действительно не нужно его кэшировать внутри объекта Phaze. Если вы это сделаете, было бы лучше отображено: @OneToMany @JoinColumn (name = "IDPHASEGROUP", referedColumnName = "IDPHASEGROUP", insertable = false, updatable = false) private List groupListPhrase;

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