2017-01-26 2 views
3
chercher

et je entité auditée avec une clé étrangère à une classe (que je ne veux pas auditer):Hibernate audit Envers @Embedded avec les types de base jette à l'intérieur champ ne peut pas mettre à null valeur sur

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

en outre, Reconocimiento est une entité avec une propriété intégrée:

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

Et la classe intégrable est la suivante:

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

Maintenant, quand j'apporte les données des révisions et chercher CitaAgenda, je reçois un

« Impossible de définir le champ booléen ... Enfermeria.diabetes à null valeur ».

Ce que je pense qu'il se passe est que Hibernate essaie d'initialiser le enfermeria propriété de Reconocimiento avec NULL parce qu'il croit que tous les champs sont NULL comme le seul champ de Reconocimiento stockées dans la table _AUD est l'ID (comme les autres ne sont pas audités). Mais ce n'est pas vrai que si je vérifie les autres champs, diabète serait faux et non NULL.

Je ne peux pas définir diabète à Booléen. Y a-t-il d'autres solutions? Merci d'avance.

+0

pouvez-vous ajouter des annotations à Enfemeria? –

+0

@Javi_Swift avez-vous une cartographie bidirectionnelle ici? Si oui 'NotAudited' sur Reconocimiento est ce que vous voulez je crois – Eugene

+0

@Eugene ce n'est pas mon cas, mais je vous remercie d'essayer –

Répondre

2

Si vous pouvez ajouter des annotations supplémentaires pour Enfemeria alors vous pouvez le marquer avec un convertisseur personnalisé:

classe embarquée

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

classe Convertisseur

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

Bien sûr vous devrez peut-être utiliser String au lieu de Integer pour la conversion. Cela dépend du type de données de colonne sous-jacent dans votre base de données.

+0

Je peux ajouter des annotations et je l'ai fait. J'ai dû changer certaines choses dans le convertisseur en raison des types que j'ai dans mon implémentation DB (Postgresql) mais ça fonctionne bien maintenant. Merci! –