J’essaie de mapper un object @Embeddable dans une sous-classe dont la classe parent a déjà un champ de ce type @Embeddable.
La documentation relative aux objects incorporables d’hibernate prétend que je peux utiliser les atsortingbuts @AtsortingbuteOverrides pour remplacer les noms de colonne d’un object @Embeddable:
par exemple
@Entity public class Person implements Serializable { // Persistent component using defaults Address homeAddress; @Embedded @AtsortingbuteOverrides( { @AtsortingbuteOverride(name="iso2", column = @Column(name="bornIso2") ), @AtsortingbuteOverride(name="name", column = @Column(name="bornCountryName") ) } ) Country bornIn; ... }
Voici le cas que j’ai:
@Embeddable public class ContentID implements Serializable { @Column(name="contentID") private Ssortingng contentPath; } @MappedSuperclass public abstract class BaseDomainObject implements Serializable { @Embedded private ContentID contentID; } public class Achievement extends BaseDomainObject { @Embedded @AtsortingbuteOverrides( { @AtsortingbuteOverride(name="contentID", column = @Column(name="awardedItem") ), } ) private ContentID awardedItem; }
L’erreur que je reçois est:
org.hibernate.MappingException: colonne répétée dans le mappage pour l’entité: colonne Achievement: contentID (doit être mappée avec insert = “false” update = “false”) à org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:652) à org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:674) à org.hibernate.mapping.PersistentClass.checkPolertyDuplication (PersistentClass.java:670) à org.hibernate.mapping.Policern ) à org.hibernate.mapping.PersistentClass.validate (PersistentClass.java:450) à org.hibernate.mapping.SingleTableSubclass.validate (SingleTableSubclass.java:43) à org.hibernate.cfg.Configuration.validate (Configuration.java: 1108) à org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1293) à org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory (AnnotationConfiguration.java:867)
METTRE À JOUR:
J’ai cherché des problèmes avec Hibernate à ce sujet et le projet GRAILS a affirmé qu’ils avaient résolu ce problème, mais que leur solution d’annotation ne semblait pas être une annotation javax.persistence valide (peut-être une nouvelle version).
JPA @ Embeddable / @ Embedded lève org.hibernate.MappingException: colonne répétée dans le mappage pour l’entité
Le problème semble être le suivant:
public class ContentID implements Serializable { @Column(name="contentID") private Ssortingng contentPath; }
Vous faites en sorte que le nom de la colonne contentPath soit “contentId” et cela se heurte à votre annotation AtsortingbuteOverride ultérieurement.
Essaye ça:
public class ContentID implements Serializable { @Column(name="contentPath") private Ssortingng contentPath; }
UPDATE Je m’interroge également sur ceci:
@Embedded @AtsortingbuteOverrides( { @AtsortingbuteOverride(name="contentID", column = @Column(name="awardedItem") ), } ) private ContentID awardedItem;
Vous semblez changer le nom de la colonne contentId ici en awardItem. Est-ce vraiment nécessaire?
Vincent a raison. Le champ atsortingbuteOverride
Nom fait référence à un nom de colonne alors qu’il devrait s’agir d’un atsortingbut / propriété d’une classe.
@AtsortingbuteOverrides( { @AtsortingbuteOverride(name="contentPath", column = @Column(name="awardedItem") ), } )
Notez que le nom correspond à la propriété de classe et non à la colonne de firebase database.
Voir la documentation
j’utilise
@JoinColumn(insertable=false, updatable=false)
comme solution de contournement.