web-dev-qa-db-fra.com

Hibernate Annotations: Pas de constructeur par défaut pour l'entité

J'essaie de conserver les objets générés par JAXB. Voici la structure de l'échantillon:

@Column(name = "reporting_identifier")
private String reportingIdentifier;
@Column(name = "apply_quiet_time")
private boolean applyQuietTime;
@Embedded
private RecipientDetailsList recipientDetailsList;

Ci-dessous, la structure de la classe RecipientDetailsList:

@ElementCollection(targetClass=String.class)
private List<RecipientDetails> recipientDetails;

Maintenant, la classe RecipientDetails a un constructeur d'argument, qui accepte une chaîne. Cette chaîne que je veux conserver dans la base de données en tant que partie intégrante de l'enregistrement. je vois 

org.hibernate.InstantiationException: pas de constructeur par défaut pour l'entité: RecipientDetailsList

exception lorsque j'essaie de sauvegarder un objet. J'ai deux questions:

  1. Avons-nous du travail autour de cette exception? Je ne peux pas changer de classe car elle est conçue pour le marshalling/unmarhsalling JAXB. Puis-je en quelque sorte stocker les objets sans modifier la structure? De plus, je ne souhaite que stocker le premier enregistrement de la liste référencée par RecipientDetails, car je ne souhaite qu’une seule ligne par objet. Je veux qu'il ignore le reste des enregistrements s'il a plus d'un enregistrement. C'est possible?

  2. Cette bonne conception consiste-t-elle à utiliser l'annotation directement dans les classes générées par JAXB? Devrais-je créer d'autres classes (et éventuellement des mappeurs/convertisseurs) juste pour stocker et récupérer les informations?

13
user3968762

Pour votre première question: cela se produit car lorsque Hibernate essaie de créer un haricot, il le fait par réflexion. Il crée l'objet en appelant le constructeur no-arg, puis en utilisant les méthodes setter pour définir les propriétés. Vous ne pouvez pas utiliser un haricot qui n'a pas de constructeur no-arg.

Pour la deuxième question: si quelque chose d’autre a généré des classes pour vous qui n’ont pas de constructeur no-arg, votre seule option (si vous ne pouvez pas modifier la classe) est de créer un wrapper qui l’entoure, ou une sous-classe qui a un constructeur sans argument. Je ne vois pas d'autre moyen de le faire si vous ne pouvez pas modifier la classe directement. Mais le sous-classement devrait être correct tant que la classe que vous avez a suffisamment de visibilité sur les méthodes (c'est-à-dire qu'elle n'a pas de méthodes privées que vous ne pouvez pas accéder à).

25
chiastic-security

Si vous marquez RecipientDetails comme @Embeddable, hibernate utilisera le constructeur avec des arguments.

@Embeddable
class RecipientDetails {

    //no default constructor

    public RecipientDetails(some arg) {}


}
0
Bukharov Sergey