2017-01-26 10 views
3

у меня есть и проверяемое лицо с внешним ключом к классу (который я не хочу проверять):Hibernate Envers аудит @Embedded с основными типами внутри броски не может установить поле обнулить значение на выборке

@Entity 
@Audited 
public class CitaAgenda { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "reconocimiento_id") 
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    private Reconocimiento reconocimiento; 
    ... 
} 

Кроме того, Reconocimiento является юридическим лицом со встроенным свойством:

@Entity 
public class Reconocimiento { 
    @Embedded 
    private Enfermeria enfermeria; 
    ... 
} 

И встраиваемого класса выглядит следующим образом:

@Embeddable 
public class Enfermeria { 
    private boolean diabetes; 
    ... 
} 

Теперь, когда я привожу данные из пересмотров и принести CitaAgenda, я получаю

«Не удается установить логическое поле ... Enfermeria.diabetes обнулить значение».

То, что я думаю, что это происходит, что Hibernate пытается инициализировать enfermeria свойство Reconocimiento с NULL, потому что он считает, что все поля являются NULL в качестве единственного поля Reconocimiento хранится в _AUD таблице идентификатор (так как остальные не проверяются). Но это не так, как если бы я проверял другие поля, диабет был бы false, а не NULL.

Я не могу установить диабет Boolean. Есть ли другие решения? Заранее спасибо.

+0

Вы можете добавить аннотации к Enfemeria? –

+0

@Javi_Swift у вас есть двунаправленное отображение здесь? Если так '@ NotAudited' на Reconocimiento - то, что вы хотите, я считаю – Eugene

+0

@Eugene, это не мое дело, но спасибо за попытку –

ответ

2

Если вы можете добавить дополнительные аннотации к Enfemeria, то вы можете пометить его с помощью пользовательского преобразователя:

Embedded класса

@Convert(converter=MyBooleanConverter.class) 
private boolean diabetes; 

Преобразователь класса

@Converter 
public class MyBooleanConverter implements AttributeConverter<Boolean, Integer>{ 
    @Override 
    public String convertToDatabaseColumn(Boolean value) { 
     if (Boolean.TRUE.equals(value)) { 
      return Integer.valueOf(1); 
     } else { 
      return Integer.valueOf(0); 
     } 
    } 

    @Override 
    public Boolean convertToEntityAttribute(Integer value) { 
     if(value != null and value.equals(1){ 
      return Boolean.TRUE; 
     } 

     return Boolean.FALSE; 
    } 
} 

Конечно вам может потребоваться использовать String вместо Integer для преобразования. Это зависит от типа данных столбца в вашей базе данных.

+0

Я могу добавить аннотации, и я сделал это. Мне пришлось изменить некоторые вещи в конвертере из-за типов, которые у меня есть в моей реализации БД (Postgresql), но теперь он работает нормально. Благодаря! –