2009-06-04 16 views
10

Estoy tratando de asignar un objeto @Embeddable en una subclase cuya clase padre ya tiene un campo de ese tipo @Embeddable.Hibernate mapeando un segundo campo @Embeddable en una subclase

La hibernación Embeddable Objects documentation reivindicaciones puedo usar los @AttributeOverrides para anular los nombres de columna de un objeto @Embeddable:

por ejemplo

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

Aquí es el caso que tengo:

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

El error que consigo es:

org.hibernate.MappingException: repetida la columna en el mapeo de entidad: columna de Logro: contentID (se debe mapear con insert = "false" update = "false") en org.hibernate.mapping.PersistentC lass.checkColumnDuplication (PersistentClass.java:652) en org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:674) en org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:670) en org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:696) en org.hibernate.mapping.PersistentClass.validate (PersistentClass.java:450) en org.hibernate.mapping.SingleTableSubclass.validate (SingleTableSubclass .java: 43) en org.hibernate.cfg.Configuration.validate (Configuration.java:1108) en org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1293) en org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory (AnnotationConfiguration.java:867)

UPDATE:

Busqué problemas de Hibernate relacionados con esto y el proyecto GRAILS afirmó que solucionaron este problema, pero su solución de anotación no parece ser una anotación válida de javax.persistence (quizás sea una versión nueva).

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

+0

Por curiosidad: ¿Por qué se incrusta país en lugar de utilizar una relación? –

Respuesta

7

El problema parece ser la siguiente:

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

Usted está haciendo el nombre de columna contentPath ser "contentId" y que está chocando con su anotación AttributeOverride más adelante.

Prueba esto:

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

ACTUALIZACIÓN También me pregunto acerca de esto:

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

Usted parece estar cambiando el nombre de la columna de contentId aquí para awardedItem. ¿Es eso realmente necesario?

+0

El problema no está causado por @AttributeOverride en Achievement, sino debido a @Embedded ContentID que está en la clase base Achievement BaseDomainObject. El problema está en las asignaciones de hibernación, la herencia hace que el objeto tenga 2 objetos ContentID incrustados como columna contentID, que pensé que AttributeOverride se encargaría de ello. Incluso si eliminé @Column (name = "contentID"), creo que el problema persistirá. – Dougnukem

1

estoy usando

@JoinColumn(insertable=false, updatable=false) 

como una solución.

2

Vincent tiene razón. El campo Nombre attributeOverride se refiere a un nombre de columna cuando debería ser un atributo/propiedad de una clase.

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

Observe que el nombre es para la propiedad de la clase y no para la columna de la base de datos.

Ver documentation

Cuestiones relacionadas