2011-08-13 3 views
1

우리 회사에서는 많은 시스템에서 작동하기 때문에 수정할 수없는 이상한 데이터베이스 모델을 가지고 있습니다. 우리가 최대 절전 모드로 데이터베이스에 연결하고 데이터를로드하는 곧은 자바 애플리케이션을 가지고 있다는 것을 알아 두십시오. 각 테이블마다 하나의 xml 매핑 파일이 있습니다.최대 절전 모드에서 복합 키가있는 엔티티 클래스 확장

데이터베이스에 대한 이상한 점은 기본 키가 없다는 것입니다. 대부분의 테이블에는 여러 열을 포함하는 고유 인덱스가 있습니다.

이제 응용 프로그램 서버 (jboss)와 ejb 모델을 사용하고 싶습니다. 그래서 다음과 같은 클래스를 만들었습니다 :

@Entity 
    @Table (name = "eakopf_t") 
    public class Eakopf implements Serializable { 

     @Embeddable 
     public static class EakopfId implements Serializable { 

      private String mandant; 

      private String fk_eakopf_posnr; 

      // I removed here the getters and setters to shorten it up 

     } 

     @Id 
     private EakopfId id; 

     private String login; 

     // I removed the getters and setters here as well  
    } 

이것은 완벽하게 작동합니다.

고객마다 데이터베이스 버전이 다르므로 각 데이터베이스 릴리스 클래스에서이 클래스를 확장하는 것이 좋습니다. 따라서 우리가 자바로 생성 한 각각의 인터페이스는 어떤 버전의 테이블이 사용될 것인지 결정할 수 있습니다. 여기

가 확장 테이블 클래스입니다

@Entity 
    @Table (name = "eakopf_t") 
    public class Eakopf6001 extends Eakopf implements Serializable { 

     private String newField; 

     // getters and setters 
    } 

나는 그것이 내가 그런 일 할 경우 작동 Eakopf (기본 버전)를 사용하는 경우 :

EakopfId id = new EakopfId(); 
id.setMandant("001"); 
id.setFk_eakopf_posnr("ABC"); 
Eakopf kopf = (Eakopf) em.find(Eakopf.class, id); 

을하지만이 작업을 수행 할 경우 :

EakopfId id = new EakopfId(); 
id.setMandant("001"); 
id.setFk_eakopf_posnr("ABC"); 
Eakopf6001 kopf = (Eakopf6001) em.find(Eakopf6001.class, id); 

이 예외 occues

,
javax.ejb.EJBException: javax.persistence.PersistenceException: 
org.hibernate.WrongClassException: Object with id: 
[email protected] was not of the specified subclass: 
de.entity.Eakopf (Discriminator: null) 

아무도 아이디어가 있습니까?

많은 인사, 당신은 하나의 테이블에 개체의 두 가지 다른 종류를 저장하고 있다는 최대 절전 모드로 전환 수단을 한 일을 수행 Hauke ​​

답변

2

. discriminator 열을 사용할 수 있습니다. 그러나 내가 올바르게 이해한다면, 당신은 테이블에있는 엔티티 중 하나만 원할 것입니다 : Eakopf6001. 이 경우 기본 클래스는 이 아니라 @MappedSuperClass으로 주석되어야합니다.

@MappedEntity (BaseEakopf라고 부름) 클래스와 EaKopf 및 EaKopf6001이라는 두 개의 엔티티를 만드는 것이 좋습니다. 각 필드에는 일련의 추가 필드가 있습니다. 사용할 클래스에 따라 매핑 된 클래스 목록에 다른 엔터티 중 하나를 포함하십시오.

내 개인적인 견해는 앱의 버전이 여러 개인 경우 동일한 항목을 사용하지만 다른 입력란을 사용해야한다는 것입니다. 버전 관리 시스템은 소스 코드가 아닌 여러 버전을 처리합니다 (즉, 가능한 모든 버전의 소스 파일 집합 하나가 아닌 앱 버전 당 소스 파일 집합이 하나).

+0

답장을 보내 주셔서 감사합니다. – Hauke

+0

우리는 테이블 3 개가있는 eakopf_t 테이블을 가지고 있습니다. 이제 고객을 위해 인터페이스를 개발했고, 세 필드 만 필요하다는 것을 알고 있으므로 Eakopf.java를 사용할 수 있습니다. 이제 몇 주 후 테이블에 새 필드를 추가하고 다른 고객을위한 다른 인터페이스를 만들고 인터페이스에 대해 네 개의 필드가 모두 필요합니다. 내 생각은 eakopf.java 클래스를 확장하고 확장 클래스 (eakopf6001.java)에 새 필드를 추가하는 것이었다.하나는 두 번째 인터페이스 (이 추가 필드가있는 고객 용)입니다. eakopf6001.java를 사용합니다. 호프가 도움이되었습니다. – Hauke

+0

가장 좋은 방법은이 새 필드를 eakopf.java에 추가하는 것입니다. 그러나 데이터베이스 스키마에이 네 번째 필드가없는 "첫 번째"고객에 대한 업데이트를 수행하면 최대 절전 모드에서 해당 필드를 찾을 수 없으므로 문제가 발생할 것입니다. – Hauke

관련 문제