2017-01-26 2 views
3
holen

ich habe und geprüften Stelle mit einem Fremdschlüssel zu einer Klasse (was ich will nicht prüfen):Hibernate Envers Audit innen mit Grundtypen @Embedded wirft Feld nicht festlegen Wert auf null auf

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

auch Reconocimiento ist ein Unternehmen mit einer eingebetteten Eigenschaft:

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

Und die integrierbare Klasse wird wie folgt:

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

, wenn ich die Daten aus den Revisionen bringen und hole CitaAgenda, erhalte ich ein

"Can not set boolean Feld ... Enfermeria.diabetes Wert auf null".

Was ich denke, es passiert ist, dass Hibernate die enfermeria Eigenschaft Reconocimiento mit NULL init versucht, weil es alle Felder sind NULL als das einzige Gebiet der Reconocimiento glaubt in der Tabelle _AUD gespeichert ist die ID (da die anderen nicht auditiert werden). Aber das ist nicht wahr, als würde ich die anderen Felder auditieren, Diabetes wäre false und nicht NULL.

Ich kann Diabetes nicht auf Boolean setzen. Gibt es andere Lösungen? Danke im Voraus.

+0

Können Sie Enfemeria Anmerkungen hinzufügen? –

+0

@Javi_Swift Haben Sie hier eine bidirektionale Zuordnung? Wenn ja '@ NotAudited' auf Reconocimiento ist, was Sie wollen, glaube ich – Eugene

+0

@Eugene, das ist nicht mein Fall, aber danke für den Versuch –

Antwort

2

Wenn Sie weitere Anmerkungen zu Enfemeria hinzufügen können, dann könnte man es mit einem benutzerdefinierten Konverter markieren:

Embedded Klasse

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

Converter Klasse

@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; 
    } 
} 

Natürlich Möglicherweise müssen Sie zum Konvertieren String statt Integer verwenden. Dies hängt vom zugrunde liegenden Spaltendatentyp in Ihrer Datenbank ab.

+0

Ich kann Anmerkungen hinzufügen und ich habe es getan. Ich musste einige Sachen im Konverter wegen der Typen ändern, die ich in meiner DB-Implementierung (Postgresql) habe, aber es funktioniert jetzt gut. Vielen Dank! –

Verwandte Themen