Hibernate отображает второе поле @Embeddable в подклассе

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

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

e.g.

@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 (должен быть сопоставлен с вставкой = "false" update = "false") в org.hibernate.mapping.PersistentClass.checkColumnDupplication (PersistentClass.java:652) в org.hibernate.mapping.PersistentClass.checkPropertyColumnDupplication(PersistentClass.java:674) в org.hibernate.mapping.PersistentClass.checkPropertyColumnDupplication(PersistentClass.java:670) в org.hibernate.mapping.PersistentClass.checkColumnDupplication(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)

ОБНОВЛЕНИЕ:

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

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


person Dougnukem    schedule 04.06.2009    source источник
comment
Из любопытства: почему вы вставляете страну вместо отношения?   -  person Jimmy T.    schedule 29.12.2013


Ответы (3)


Проблема кажется вот в чем:

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

ОБНОВЛЕНИЕ Меня также интересует следующее:

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

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

person Vincent Ramdhanie    schedule 04.06.2009
comment
Проблема вызвана не @AttributeOverride в Achievement, а из-за @Embedded ContentID, который находится в базовом классе BaseDomainObject Achievement. Проблема в сопоставлениях гибернации: наследование приводит к тому, что объект имеет 2 объекта Embedded ContentID в качестве столбца contentID, о котором, как я думал, позаботится AttributeOverride. Даже если я удалю @Column(name=contentID), думаю, проблема останется. - person Dougnukem; 04.06.2009

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

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

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

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

person Bryant    schedule 27.04.2012

я использую

@JoinColumn(insertable=false, updatable=false)

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

person ian    schedule 09.08.2009