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.зимовать.MappingException: Повторный столбец в сопоставлении для объекта: Колонка достижений: contentID (должен сопоставляется с insert= " false" update= "false") на орг.зимовать.отображение.PersistentClass.checkColumnDuplication (PersistentClass.java: 652) на орг.зимовать.отображение.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java: 674) на орг.зимовать.отображение.PersistentClass.checkPropertyColumnDuplication (PersistentClass.java: 670) на орг.зимовать.отображение.PersistentClass.checkColumnDuplication (PersistentClass.java: 696) на орг.зимовать.отображение.PersistentClass.validate (PersistentClass.java: 450) на орг.зимовать.отображение.SingleTableSubclass.validate (SingleTableSubclass.java: 43) на орг.зимовать.контекстно-свободная грамматика.Конфигурация.проверка (конфигурация.java: 1108) на орг.зимовать.контекстно-свободная грамматика.Конфигурация.buildSessionFactory(конфигурацию.java: 1293) на орг.зимовать.контекстно-свободная грамматика.AnnotationConfiguration.buildSessionFactory (AnnotationConfiguration.java: 867)

обновление:

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

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

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


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

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

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

посмотреть документация


Я использую

@JoinColumn(insertable=false, updatable=false)

как временное решение.