2012-02-09 2 views
0

Я пытаюсь протестировать некоторые DAO.наследование и дискриминатор объектаColumns

У меня есть объект (и таблицы) с именем 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). Один (NOMINATION) имеет общие столбцы. Это совпадает с моим первым типом номинации: 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 дискриминатор ... но он должен быть в состоянии быть доступен для записи. Надеюсь, вы, ребята, снова сможете мне помочь.

Edit: это моя схема

Schema

ответ

2

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

+0

Я не присоединяюсь к этой колонке, я присоединяюсь к ID - мое впечатление заключается в том, что оно будет «различать», как сказано в названии, и присваивать строку с x category_code конкретному дочернему объекту. Возможно, я должен был сказать это первым. Я отредактирую и покажу свою схему, надеюсь, это будет яснее. – Nimchip

+0

@JoinColumn (name = "CATEGORY_CODE", referencedColumnName = "CATEGORY_CODE") – Bozho

+0

Итак, вы говорите, что я должен просто удалить это и позволить дочерним сущностям обрабатывать, какой Category_code установить? Я думаю, что я знаю, что вы говорите (может быть?), Но я написал объединения на основной номенклатуре объектов, прежде чем узнал о аннотации дискриминатора (только что узнал сегодня, потому что последний набор таблиц, для которых я тестирую DAO, и они просто не работали). – Nimchip

Смежные вопросы