Hibernate Envers, создающий измененные поля для отношений OneToMany, принадлежащих иностранцам

Я использую Hibernate 4.3.1.Final

Если у меня есть две сущности, скажем, A и B. A содержит набор объектов B, которые помечены как ассоциация OneToMany.
Если я установлю для параметра "org.hibernate.envers.global_with_modified_flag" значение true, а для параметра "org.hibernate. envers.modified_flag_suffix" на "Modified", то Envers правильно добавляет столбцы для всех столбцов в этой таблице с указанным суффиксом, но также ожидает найти измененный столбец для каждой ассоциации, даже если они принадлежат иностранному side.
В приведенном ниже случае Envers ожидает столбцы в A для "foo", "fooModified" и "bObjectsModified", когда я думаю, что он должен ожидать столбцы для "foo" и "fooModified" в A и "aIdModified" в Б.

@Entity
@Table("A")
@Audited
class A {
private String foo;
private Set<B> bObjects;

@Column(name = "foo")
public getFoo( return foo; )

@OneToMany(fetch = FetchType.LAZY,
        mappedBy = "a")
public Set<B> getBObjects() { return bObjects; }
}

@Entity
@Table("B")
@Audited
class B {
private A a;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "aId")
public getA(){ return a; }
}

Кто-нибудь еще видел это? Как мне изменить это поведение, кроме как аннотировать каждое из моих @ManyToOne отношений с @Audited(withModifiedFlag=false). У меня много тысяч отношений, так что даже проверка этой части будет огромной болью. Альтернативой является принуждение базы данных к сведениям о нашем Java-коде, которые ей не нужны, и это значительно усложняет добавление двунаправленных ассоциаций.


person moriarty-s3A    schedule 28.02.2014    source источник


Ответы (1)


Для тех, кто может прийти позже, по крайней мере, начиная с 4.3.1.Final, единственный способ сделать это — удалить флаг глобальной конфигурации и добавить этот параметр в аннотацию @Audited для каждого класса, чтобы он был @Audited(withModifiedFlag=true), а затем добавить @Audited(withModifiedFlag=false) для каждого свойства (не столбца!) в этом классе, для которого вы не хотите создавать измененное поле.

В других модулях Hibernate глобальные параметры конфигурации могут быть переопределены на уровне класса или атрибута. Для Envers глобальные параметры конфигурации никогда не могут быть переопределены.

Также обратите внимание, что измененные имена полей основаны на имени атрибута в классе Java, а не на значении в аннотации @Column, которую использует остальная часть Hibernate ORM.

person moriarty-s3A    schedule 06.03.2014
comment
Спасибо за Также обратите внимание, что измененные имена полей основаны на имени атрибута в классе Java, а не на значении в аннотации столбца, которое использует остальная часть Hibernate ORM. Я получал DuplicateMappingException, используя значение имени в аннотации столбца, и JPA искал столбцы значения имени. Установка для naming.physical-strategy значения PhysicalNamingStrategyStandardImpl решила проблему. - person OkraSala; 29.09.2017