2012-02-09 4 views
0

일부 DAO를 테스트하려고합니다.엔티티 상속 및 discriminatorColumns

@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 개 개의 테이블이 (:

나는 Nomination라는 이름의 엔티티 (테이블)을 가지고, 그것은 몇 가지 속성을 가지고 후보, team_nom, idea_nom, success_nom). 하나 (지명)에는 공통 열이 있습니다. 이것은 CoworkerNom라고하는 첫 번째 추천 유형과 일치합니다. NOMINATION 테이블에 나열된 것만 필요하기 때문에 별도의 테이블이 없습니다. 다른 3 개 후보작은 TeamNom, SuccessNomIdeaNom입니다. 이것들은 추가적인 데이터를 가지고 있기 때문에 그들 자신의 테이블을 가지며, 그래서 그들 자신의 엔티티도 가지고 있습니다. 예를 들어

@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 

이 구조 SuccessNomTeamNom 적용된다.

이 작업을 수행하는 방법을 이해하는 데 문제가 있습니다. 그러나 지금은 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는 판별입니다 ...하지만 쓰기 가능 할 수 있어야한다. 바라건대 너희들이 나를 다시 도울 수 있기를.

편집 : 당신은 판별 자 컬럼을지도 insert="false" update="false"로 매핑해야하는 경우이 내 스키마

Schema

답변

2

입니다. Hibernate는 이것이 한번 선언 된 것으로 간주하고, 쓰기 가능하지 않다. 그것은 최대 절전 모드에 의해서만 관리 될 수있다. 또한 해당 열에 참여하는 것이 약간 이상합니다.

+0

나는 그 열에 합류하지 않고있다. 나는 ID에 가입하고있다. 내 감동은 그 이름이 말하고 x category_code가있는 행을 특정 하위 엔티티에 속성으로 지정한다는 것이다. 아마 내가 먼저 말 했어야했다. 필자는 스키마를 편집하고 보여줄 것이므로 잘하면 더 명확해질 것이다. – Nimchip

+0

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

+0

그래서 그냥 제거하고 하위 엔터티가 어떤 Category_code를 설정할 수있게해야한다고 말하는 것입니까? 나는 당신이 무엇을 말하고 있는지 알고 있다고 생각합니다. (아마도?)하지만 나는 discriminator annotations에 대해 알아 내기 전에 주체 (subject) 지명 (nominal)에 조인을 썼습니다. (DAO를 테스트하고있는 테이블 세트 단순히 작동하지 않았다). – Nimchip