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

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

Спящий режим Документация встраиваемых объектов утверждает, что я могу использовать @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 (должен отображаться с вставкой = "false" 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: повторный столбец при сопоставлении для объекта

Ответ 1

Проблема заключается в следующем:

 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 здесь, на присваиваемыйItem. Это действительно необходимо?

Ответ 2

Винсент прав. Поле attributeOverride Name ссылается на имя столбца, когда оно должно быть атрибутом/свойством класса.
@AttributeOverrides( {
    @AttributeOverride(name="contentPath", column = @Column(name="awardedItem") ),
} )

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

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

Ответ 3

Я использую

@JoinColumn(insertable=false, updatable=false)

в качестве обходного пути.