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)
в качестве обходного пути.