2012-02-10 5 views
1

내 스키마는 다음과 같습니다 공동의 가치 + 확장 아버지의 실체와 중앙 테이블 :엔티티 상속 :

Schema

NOMINATION 표는 나의 후보의 4 사이의 공통 데이터를 보유하고 있습니다. 당신이 볼 수있는

  • 팀 지명은
  • 아이디어 지명
  • 성공 후보 추천
  • 지금, 나는 단지 3가

    1. 동료 지명 :

      나는 후보의 4 개 유형이 이 레거시 데이터 모델에서 동료 임명이 필요로하는 유일한 데이터는 추천 표.

      그래서 기본적으로 나는 차별에 열 CATEGORY_CODEDiscriminatorColumn을 사용하고 메인 Nomination 엔티티로부터 상속 5 개 단체, 4를했다.

      Nomination 법인 ->CoworkerNom, TeamNom, IdeaNom, SuccessNom. 특정 테이블에서

      1. 왜 특정의 DAO가 인출되지 않은 열 :

      나는이 개 질문이?

      Nomination.java :

      @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; 
      
          //So on 
      

      IdeaNom.java :

      @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; 
      
          //so on 
      

      AuditableEntity.java :

      @MappedSuperclass 
      public abstract class AuditableEntity { 
          /** 
          * The user who last updated this object. This object is lazy loaded, so 
          * make sure a session is open 
          */ 
          @ManyToOne(cascade = {CascadeType.PERSIST, 
            CascadeType.MERGE}, fetch = FetchType.LAZY /*optional = true*/) 
          @JoinColumn(name = "UPDATED_BY", referencedColumnName = "EMP_ID", 
            nullable = true) 
          @Cascade(value = {org.hibernate.annotations.CascadeType.PERSIST, 
            org.hibernate.annotations.CascadeType.MERGE, 
            org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
          private Employee modifiedBy = null; 
          /** 
          * The last system update timestamp for this entity 
          */ 
          @Column(name = "UPDATED_DATE", nullable = true) 
          @Temporal(value = TemporalType.TIMESTAMP) 
          private Date modifiedOn = null; 
      
          //getters and setters 
      

      내 findByAll 방법은 다음과 같습니다

      예를 들어
      public List<T> findAll() { 
           if (logger.isDebugEnabled()) { 
            logger.debug("findAll"); 
           } 
           return currentSession().createCriteria(getPersistentClass()).list(); 
          } 
      

      및 내 DAO는 기본적으로이 메서드가 위치한 AbstractHibernateDAO에서 상속받습니다. AbstractHibernateDAO ->NominationHibernateDAO ->IdeaNomHibernateDAO과 같습니다.

      Caused by: java.sql.SQLException: Invalid column name 'ACTUAL_SITUATION'. 
          at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368) 
          at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820) 
          at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258) 
          at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632) 
          at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:477) 
          at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:778) 
          at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
          at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
          at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
          at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 
          at org.hibernate.loader.Loader.doQuery(Loader.java:802) 
          at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
          at org.hibernate.loader.Loader.doList(Loader.java:2533) 
          ... 38 more 
      

      ACTUAL_SITUATION는 Idea_Nom 열, 그래서 NOMINATION에서 일반 컬럼에서의 정지를 추측하고, 특정 열을 가져 오는 아니에요 :

      나는 다음과 같은 오류가 발생합니다.

      2. 유형에 관계없이 모든 후보자 명단을 어떻게 얻을 수 있습니까? Nomination 엔터티에 대해 제네릭 DAO를 단독으로 실행할 수 있습니까? 이것은 내가 이미 NominationHibernateDAO을 가지고 있다고 언급 한 바보 같은 질문 일지 모르지만, 지금까지 나의 카운트 방법이 DiscriminatorColumn을 기반으로하는 특정 카운트만을 반환하기 때문에 나는 단지 궁금하다.당신이 상속 전략을 지정하지 않은 Nomination에서

    답변

    1

    , 난 당신이 JOINED 전략을 사용한다고 생각 :

    @Entity(name = "Nomination") 
    @Table(name = "NOMINATION") 
    @Inheritance(strategy=InheritanceType.JOINED) 
    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; 
    
        ... 
    } 
    
    @Entity 
    @PrimaryKeyJoinColumn(name="NOM_ID") 
    public class IdeaNom extends Nomination { ... }   
    

    당신은 봐야한다 Mapping Entities

    (2) JPA와 당신에 대한 쿼리를 할 경우 Nomination 같은 위의 hierachy의 루트는 :

    select n from Nomination n 
    

    그것은, 그것은 알은 다형성 쿼리로드됩니다 그래서 Nomination 하위 클래스.

    +0

    나는 이것을 시도하고 알려 드리겠습니다. – Nimchip

    +0

    이제 나는 다음과 같이 나타납니다 :'원인 : java.sql.SQLException : 잘못된 열 이름 'UPDATED_BY'. 이것은 아버지 엔티티 '지명'이 상속하는 'AuditableEntity'에 속합니다. 스 니펫 상단에 '추천'을 표시 할 수 있습니다. – Nimchip

    +0

    내 메인 포스트에 추가 된, 나는이 골격 엔티티를 사용했습니다. 내 골격 엔티티와 그 다른 엔티티들도 테스트 해 보았습니다 ... – Nimchip

    관련 문제