2009-06-04 24 views
10

Sto tentando di mappare un oggetto @Embeddable in una sottoclasse la cui classe padre ha già un campo di quel tipo @Embeddable.Hibernate mappatura di un secondo campo @Embeddable in una sottoclasse

La sospensione Embeddable Objects documentation rivendicazioni posso utilizzare la @AttributeOverrides per sostituire i nomi delle colonne di un oggetto @Embeddable:

esempio

@Entity 
public class Person implements Serializable { 

    // Persistent component using defaults 
    Address homeAddress; 

    @Embedded 
    @AttributeOverrides({ 
      @AttributeOverride(name="iso2", column = @Column(name="bornIso2")), 
      @AttributeOverride(name="name", column = @Column(name="bornCountryName")) 
    }) 
    Country bornIn; 
    ... 
} 

Qui è il caso che ho:

@Embeddable 
    public class ContentID implements Serializable { 
     @Column(name="contentID") 
     private String contentPath; 
    } 

    @MappedSuperclass 
    public abstract class BaseDomainObject implements Serializable { 

     @Embedded 
     private ContentID contentID; 
    } 

public class Achievement extends BaseDomainObject { 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
    }) 
    private ContentID awardedItem; 
} 

L'errore che ottengo è:

org.hibernate.MappingException: colonna ripetuta nella mappatura per l'entità: Achievement colonna: contentID (dovrebbe essere essere mappato con insert = "false" update = "false") a org.hibernate.mapping.PersistentC lass.checkColumnDuplication (PersistentClass.java:652) a org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:674) a org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:670) a org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:696) a org.hibernate.mapping.PersistentClass.validate (PersistentClass.java:450) a org.hibernate.mapping.SingleTableSubclass.validate (SingleTableSubclass .java: 43) a org.hibernate.cfg.Configuration.validate (Configuration.java:1108) a org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1293) a org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory (AnnotationConfiguration.java:867)

UPDATE:

Ho cercato i problemi di Hibernate relativi a questo e il progetto GRAILS ha affermato che hanno risolto il problema, ma la loro soluzione di annotazione non sembra essere un'annotazione javax.persistence valida (forse è una nuova versione).

JPA @Embeddable/@Embedded throws org.hibernate.MappingException: Repeated column in mapping for entity

+0

curiosità: Perché si incorpora paese invece di utilizzare un rapporto? –

risposta

7

Il problema sembra essere questo:

public class ContentID implements Serializable { 
    @Column(name="contentID") 
    private String contentPath; 
} 

Si stanno facendo il nome della colonna contentPath di essere "contentid" e che è scontrandosi con l'annotazione AttributeOverride in seguito.

Prova questo:

public class ContentID implements Serializable { 
    @Column(name="contentPath") 
    private String contentPath; 
} 

UPDATE sto anche chiedendo a questo:

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="contentID", column = @Column(name="awardedItem")), 
}) 
private ContentID awardedItem; 

Lei sembra stia cambiando il nome della colonna ContentID qui per awardedItem. È davvero necessario?

+0

Il problema non è causato da @AttributeOverride in Achievement, ma a causa del ContentID @ Embedded che si trova nella classe base di Achievement BaseDomainObject. Il problema è nei mapping di ibernazione l'ereditarietà fa sì che l'oggetto abbia 2 oggetti ContentID incorporati come colonna contentID che pensavo che AttributeOverride si sarebbe occupato di esso. Anche se ho rimosso @Column (name = "contentID"), penso che il problema rimarrebbe. – Dougnukem

1

sto usando

@JoinColumn(insertable=false, updatable=false) 

come una soluzione.

2

Vincent ha ragione. Il campo Nome attributeOverride si riferisce a un nome di colonna quando deve essere un attributo/proprietà di una classe.

@AttributeOverrides({ 
    @AttributeOverride(name="contentPath", column = @Column(name="awardedItem")), 
}) 

Si noti che il nome è per la proprietà di classe non la colonna del database.

Vedi documentation

Problemi correlati