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.аннотации сохраняемости (возможно, это новая версия).
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 не столбец базы данных.
посмотреть документация