2012-06-15 2 views
2

최대 절전 모드 4를 사용하기 위해 웹 응용 프로그램을 업그레이드했습니다. 그 후 몇 가지 문제점이있어서 도움이 필요합니다. 그런 다음최대 절전 모드 4, @ 상속 및 @GeneratedValue 오해로의 마이그레이션

@MappedSuperclass 
public class BaseDomainObject implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column 
    protected Integer id; 

    public Integer getId() { 
      return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 
} 

를,이 같은 엔티티를 많이 가지고 :

내가, 내 도메인 개체에 대한 하나 개의 기본 클래스가은 다음과 같습니다

@Entity 
@Table(name="[user]") 
public class User extends BaseDomainObject { 

    @Column(name="first_name") 
    private String  firstName; 
    @Column(name="last_name") 
    private String  lastName; 

    .... 
} 

그리고 난 일부 상속 사이가 엔티티 : 내가 HQL 질의를 할 때

@Entity 
@Table(name="record_data") 
@Polymorphism(type=PolymorphismType.EXPLICIT) 
public class RecordData extends BaseDomainObject { 
    .... 
} 


@Entity 
@Table(name="auto_data") 
@Polymorphism(type=PolymorphismType.EXPLICIT) 
public class AutoData extends RecordData { 

} 

내가이 예외가

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'DTYPE'. 

16,최대 절전 소스 코드에서 나는 엔티티가있는 경우는 DiscriminatorColumn를 연결하여 각 쿼리에 있도록 부모가 기본적으로 SINGLE_TABLE 상속에 넣어 최대 절전 것을보고 있지만, 각 클래스가 다른 테이블에 매핑되는 때문에, 더 판별 자 컬럼이 없습니다.

이 문제를 해결하기 위해 난 내 기관에이 주석 넣어 :

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 

을하지만 그 후 나는 또 다른 exeption

Caused by: org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: bla.bla.RecordData 

나는 이것에 대한 웹에서 해결책을 찾았을 얻었다. 이 표

@GeneratedValue(strategy=GenerationType.TABLE) 

내 BaseDomainObject에 @GeneratedValue의 전략을 변경해야하지만이 내 DB의 모든 테이블이 자동 증가 ID가

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'hibernate_sequences'. 

다른 예외 발생 .. 그래서 난 몰라 최대 절전 모드로 관리 할 수 ​​있습니다.

나는 무엇인가 놓친다?

답변

0

일부 설명 :

Caused by: org.hibernate.MappingException: Cannot use identity column 
key generation with <union-subclass> mapping for: bla.bla.RecordData 

여러 테이블에 엔티티를 상속 가지고있는 경우에 그 이유가있다, 이것은 아마 같은 키를 생성하는 것처럼 (키를 생성하기 위해 ID 열을 사용하는 방법이 아니다 다른 열에). 쿼리에서 모든 BaseDomainObjects를 검색하려고한다면 상충되는 기본 키를 이런 식으로 가질 수 없다고 상상해보십시오.

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 
'hibernate_sequences'. 

ID 생성 전략을 TABLE으로 설정했지만 어떤 이유로 최대 절전 모드에서이 ID를 저장할 테이블을 만들지 않았습니다. 수동으로 생성하거나 최대 절전 모드가 시작될 때 최대 절전 모드를 생성하지 않는 이유를 찾아야합니다.

제안 : 당신이 그것을 시도했습니다으로

  • 신원 열 및 상속이 잘 재생되지 않습니다. @Inheritance (strategy = InheritanceType.JOINED)를 시도해보아야합니다. 이는 ID 컬럼이있는 기본 클래스에 대한 테이블을 작성하고 나머지 속성을 다른 테이블에 저장하기 때문입니다.

  • 위에서 실패하면

    가 합류

+0

해결책 아니다 @GeneratedValue (= GenerationType.SEQUENCE 전략)를 지정하여, 서열을 사용한다. SEQUENCE를 사용하면 "com.softrunner.init.SrtSQLServerDialect가 시퀀스를 지원하지 않습니다.".. 그래서 최대 절전 모드 3으로 돌아 가야한다는 것을 이해합니다. –

+0

아마도 너무 늦었 겠지만 "JOINED"문제는 무엇입니까? – Swapnil