Hibernate отображает второе поле @Embeddable в подклассе - PullRequest
11 голосов
/ 04 июня 2009

Я пытаюсь отобразить объект @Embeddable в подклассе, родительский класс которого уже имеет поле этого типа @Embeddable.

Документация hibernate Embeddable Objects утверждает, что я могу использовать @AttributeOverrides для переопределения имен столбцов объекта @Embeddable:

, например

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

Вот мой случай:

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

Я получаю ошибку:

org.hibernate.MappingException: Повторный столбец в сопоставлении для сущности: Столбец достижения: contentID (должен отображаться с помощью вставки = "ложь" update = "false") в org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:652) в org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:674) в org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java:670) в org.hibernate.mapping.PersistentClass.checkColumnDuplication (PersistentClass.java:696) в 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)

UPDATE:

Я искал проблемы Hibernate, связанные с этим, и проект GRAILS утверждал, что они исправили эту проблему, но их решение для аннотаций, похоже, не является действительными аннотациями javax.persistence (возможно, это новая версия).

JPA @ Embeddable / @ Embedded throws org.hibernate.MappingException: повторяющийся столбец в сопоставлении для сущности

Ответы [ 3 ]

7 голосов
/ 04 июня 2009

Кажется, проблема в следующем:

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

Вы задаете имя столбца contentPath как «contentId», что позже будет конфликтовать с вашей аннотацией AttributeOverride.

Попробуйте это:

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

UPDATE Мне тоже интересно об этом:

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

Похоже, вы меняете здесь имя столбца contentId на награждаемый элемент. Это действительно необходимо?

2 голосов
/ 28 апреля 2012

Винсент прав. Поле attributeOverride Name ссылается на имя столбца, когда оно должно быть атрибутом / свойством класса.

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

Обратите внимание, что это имя свойства класса, а не столбца базы данных.

См. документацию

1 голос
/ 10 августа 2009

Я использую

@JoinColumn(insertable=false, updatable=false)

как обходной путь.

...