наследование сущностей иcriminatorColumns - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь проверить некоторые DAO.

У меня есть Entity (и таблица) с именем Nomination, у него есть некоторые свойства:

@Entity(name = "Nomination")
@Table(name = "NOMINATION")
@DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1)

public class Nomination extends AuditableEntity {

@Id
@Column(name = "NOM_ID", insertable = true, updatable = true,
        nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Transient
protected NominationType type = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "PERIOD_ID", referencedColumnName = "PERIOD_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private NomPeriod period = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "CATEGORY_CODE", referencedColumnName = "CATEGORY_CODE")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Category category = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "NOMINATOR_ID", referencedColumnName = "EMP_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Employee nominator = null;

@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "STATUS_ID", referencedColumnName = "STATUS_ID")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
        org.hibernate.annotations.CascadeType.MERGE})
private Status status = null;

//more after this line

Теперь у меня есть 4 различных типа номинаций (идея, команда, успех и номинации коллег)) и 4 разных стола (номинация, team_nom, idea_nom, success_nom).Один (НОМИНАЦИЯ) имеет общие столбцы.Это совпадает с моим первым типом номинации под названием CoworkerNom.Для этой таблицы нет отдельной таблицы, так как для нее нужно только то, что указано в таблице NOMINATION.Другие 3 номинации: TeamNom, SuccessNom и IdeaNom.У них есть свои собственные таблицы, поскольку у них есть дополнительные данные, и поэтому у них также есть свои собственные сущности.Например:

@Entity(name = "IdeaNom")
@Table(name = "IDEA_NOM")
@DiscriminatorValue("I")

public class IdeaNom extends Nomination {

@Column(name = "PURPOSE_INC", insertable = true, updatable = true,
        nullable = true)
private Boolean purposeIncrease;

@Column(name = "PURPOSE_SIMPLIFY", insertable = true, updatable = true,
        nullable = true)
private Boolean purposeSimplify;

//more after this line

Эта структура применяется к SuccessNom и TeamNom.

У меня проблемы с пониманием, как это сделать, но сейчас я сделал несколько DAO и пытаюсь их протестировать.Однако я получаю следующую ошибку:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: 

com.dev.test.data.entity.SuccessNom column: CATEGORY_CODE (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474)
    at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:65)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1362)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1865)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1479)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    ... 54 more

Прежде всего, CATEGORY_CODE является дискриминатором ... но он должен иметь возможность записи.Надеюсь, что вы, ребята, сможете помочь мне еще раз.

Редактировать: это моя схема

Schema

1 Ответ

3 голосов
/ 10 февраля 2012

Если вам нужно сопоставить столбец дискриминатора, сопоставьте его с insert="false" update="false". Hibernate считает, что он объявлен один раз, и он не доступен для записи - им может управлять только Hibernate. Также немного странно присоединиться к этому столбцу.

...