2013-03-25 2 views
2

Я использую Hibernate и Envers 3.6.10 поверх Postgresql. Я сопоставил двунаправленное отношение OneToMany, используя JoinTable между объектами A и B следующим образом.Включает ввод идентификатора null в двунаправленном OneToMany с JoinTable

Класс A:

@Entity 
@Audited 
public class A { 
    // Other stuff 

    @OneToMany() 
    @Cascade(CascadeType.ALL) 
    @LazyCollection(LazyCollectionOption.TRUE) 
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") }) 
    private Set<B> setOfBs; 

    // Getters + Setters + HashCode + Equals 
} 

Класс B:

@Entity 
@Audited 
public class B { 
    // Other stuff 

    @ManyToOne(optional=true) 
    @LazyCollection(LazyCollectionOption.TRUE) 
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "B_ID") }, inverseJoinColumns = { @JoinColumn(name = "A_ID") }) 
    private A a; 

    // Getters + Setters + HashCode + Equals 
} 

Там нет никаких проблем, когда сохраняющиеся объект A с набором Bs через save(). Даже без установки явно двунаправленную связь между B и A. Проблема появляется, когда Envers делает вставки, чтобы сохранить ревизию в таблице JoinTable ауд получаю это исключение:

Hibernate: insert into a_b_AUD (a_id, b_id, REV) values (?, ?, ?) 
16:27:38,051 TRACE BasicBinder:70 - binding parameter [1] as [BIGINT] - <null> 
16:27:38,051 TRACE BasicBinder:82 - binding parameter [2] as [BIGINT] - 2038 
16:27:38,051 TRACE BasicBinder:82 - binding parameter [3] as [INTEGER] - 2039 
16:27:38,056 WARN JDBCExceptionReporter:233 - SQL Error: 0, SQLState: 23502 
16:27:38,056 ERROR JDBCExceptionReporter:234 - ERROR: null value in column «a_id» violates not null restriction 

Если установить режим полной отладки в спящем I может видеть, что Envers «знает» этот Id, но не передает его во вставку. Как я могу решить эту проблему? Правильно ли сопоставлено отношение? Для Envers нужна специальная конфигурация. управлять этим?

С уважением.

+0

Я могу подтвердить эту проблему. –

+1

Он еще не разрешен, как вы можете видеть на JIRA [HHH-8305] (https://hibernate.atlassian.net/browse/HHH-8305) – hespresati

+0

Эта ошибка теперь разрешена в последних версиях Hibernate. Дополнительная информация о [JIRA HHH-8305] (https://hibernate.atlassian.net/browse/HHH-8305) – hespresati

ответ

2

Это может быть ошибка в Envers, так как это довольно нетипичный способ сопоставить отношение. На самом деле, с точки зрения Hibernate, это два однонаправленных отношения, которые по инциденту отображаются в одни и те же столбцы.

Чтобы иметь двунаправленное отношение, вам нужно будет «mappedBy» в @OneToMany.

+3

Доброе утро! Спасибо за ваш ответ. Это была одна из вещей, которые я пробовал, но я всегда получаю 'Caused by: org.hibernate.MappingException: Невозможно прочитать сопоставленный атрибут для listB в com.arplatia.ns.server.prueba.B!'. Я смотрел немного больше, и я просто обнаружил, что на этом было [JIRA] (https://hibernate.atlassian.net/browse/HHH-4962), так как это 3.3.2, поэтому мне кажется, что мне нужно update Hibernate до последней версии – hespresati

+0

«mappedBy» не помогло. Также [HHH-4962] (https://hibernate.atlassian.net/browse/HHH-4962), поскольку я уже запускаю 4.1.12.Final. –

1

Проблема заключается в генерируемый DDL:

CREATE TABLE public.a_b_aud (
    b_id BIGINT NOT NULL, 
    rev INTEGER NOT NULL, 
    a_id BIGINT NOT NULL, 
    CONSTRAINT a_b_aud_pkey PRIMARY KEY(a_id, rev), 
    CONSTRAINT fk_5689e745b66c4ee2a8822e44079 FOREIGN KEY (b_id, rev) 
    REFERENCES public.b_aud(id, rev) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
    NOT DEFERRABLE, 
    CONSTRAINT fk_b5c868c4f5f34d35bdb7a6c1281 FOREIGN KEY (a_id, rev) 
    REFERENCES public.a_aud(id, rev) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
    NOT DEFERRABLE 
) WITHOUT OIDS; 

Колонка b_id должна быть обнуляемым, как Envers ожидать, что это будет. Точно так же, как в том же столбце в таблице public.a_b. Я считаю, что проблема ограничена генератором DDL.

A к B OneToOne отношения двунаправленного опциональный и A является владельцем, поэтому b_id может быть обнуляемым и почему первичные ключевые моменты PRIMARY KEY(a_id, rev).

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