2012-05-16 2 views
1

다음은 해결책을 찾을 수없는 문제입니다. 불가능할 수도 있고, 전체적인 생각으로 잘못된 방향으로 가고 있습니다.이미 존재하는 데이터베이스에 JPA 상속을 도입했습니다.

처음에 내 JPA 계층 구조의 부분과 같이했다 : 어떤 객체의 사용자 정의 필드에 대한 필요가 발생 할 때까지

@MappedSuperclass 
public abstract class AbstractEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected Long id; 
    ..... 
} 

@Audited 
@Entity 
@Table(name = "T_MEETING") 
public class Meeting extends AbstractEntity implements Groupable {...} 

@Audited 
@Entity 
@Table(name = "T_QUESTION") 
public class Question extends AbstractEntity implements Groupable {...} 

이 데이터베이스는 몇 시간 동안 사용되어왔다.

나는 길을 follwing을 가기로 결정 - 사용자 정의 필드를 가지는 객체에있는 추상적 인 실체 붙어 : 나는 다른 옵션을 시도했다

@Audited 
@Entity 
@Table(name = "T_CF_OBJECT") 
@Inheritance(strategy = InheritanceType.JOINED) 
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "CF_OBJECT_ID") 
public abstract class EntityWithCustomFields extends AbstractEntity {...} 

@Audited 
@Entity 
@Table(name = "T_QUESTION") 
public class Question extends EntityWithCustomFields implements Groupable {...} 

@Audited 
@Entity 
@Table(name = "T_MEETING") 
public class Meeting extends EntityWithCustomFields implements Groupable {...} 

와 문제는 항상있다 :

  1. JPA 공급자 (내 경우 최대 절전 모드), 부모님이 먼저 삽입하므로 CF_OBJECT_IDnull

    최대 절전 모드 : 삽입 i (활성, 날짜, c_group, last_notification_date, only_for_members, place, questions_order, subject, update_date, id) 값 (?,?,?, ?,)에 t_meeting에 삽입하십시오. 나는 기본 엔티티에 @PrimaryKeyJoinColumn 주석을 생략하면?,?,?,?,?,?)

  2. , 그 자손의 IdId의 조인 열과 무엇 리드로 사용에 서브 클래스 테이블입니다 같은 이드가 아니야. 처음에는 좋았지 만 두 테이블에 이미 많은 수의 레코드가 있으며 id 열에 같은 값을 가지고 있습니다. 테이블에서 id을 변경하는 것은 옵션이 아닙니다.

내 경우에 상속을 사용하는 올바른 방법은 무엇일까? 가능한 한 원활하게 들어갈 수 있습니까? 내가 어떻게 hibernate가 먼저 서브 클래스 인스턴스를 유지하게하고 그 ID를 지속 된 수퍼 클래스에 전달 하는지를 알아 내면 좋을 것이다. 그게 주석이 될거야, 그렇지?

편집 : 제안에 관해서는 정말 다음과 같은 이유로 @MappedSuperClass을 사용할 수 없습니다 @MappedSuperclass

를 사용합니다. 부모 클래스 EntityWithCustomFieldsCustomFieldValue 클래스의 ManyToOne 관계를 참조하는 데 사용됩니다.

@Entity 
@Audited 
@Table(name = "T_CF_VALUES") 
public class CustomFieldValue extends AbstractEntity { 
    @ManyToOne 
    @JoinColumn(name = "customFieldObject", nullable = false) 
    private EntityWithCustomFields customFieldObject; 
    .... 
} 
@Audited 
@Entity 
@Table(name = "T_CF_OBJECT") 
@Inheritance(strategy = InheritanceType.JOINED) 
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "CF_OBJECT_ID") 
public abstract class EntityWithCustomFields extends AbstractEntity { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "customFieldObject", cascade = CascadeType.ALL) 
    private List<CustomFieldValue> customFields; 
    .... 
} 

나는 @MappedSuperclass이 물건의 종류에 사용할 수 있습니다 생각하지 않는다 다음과 같은 코드에서이 보일 것이다.

답변

0

여기 엔 엔티티 상속을 원하지 않지만 사용자 정의 필드가있는 엔티티에 대해 매핑 된 수퍼 클래스가 추가 된 것으로 보입니다.

실질적인 기능적 관계가있는 경우 엔티티 상속을 사용해야합니다. 예를 들어, 인보이스에는 제품 목록이 있고 제품 ​​엔티티는 상속 트리 (식물, 육류, 옷 등)의 루트가됩니다. 이 경우 야채는 하나의 제품이며 물론 두 개의 제품이 동일한 ID를 갖지 않을 수 있습니다. 예를 들어 가격 엔티티가 외래 키를 통해 제품을 참조 할 수 있고 두 제품의 ID가 같으면 ' 전혀 일하지 않는다.

사용자 정의 필드가있는 항목은 완전히 관련이 없습니다. 그들은 단지 공통 필드를 가지기 때문에 이러한 공통 필드를 수퍼 클래스에 넣음으로써이를 고려해야합니다. 이것이 MappSuperclass가 지향하는 것입니다. 그리고 이러한 사용자 정의 필드는 각각의 엔티티 테이블에 복제되어야합니다. 이것은 어쨌든 조인 된 상속 (쿼리가 늘어나고 쿼리가 더 복잡하고 어렵다)보다 훨씬 효율적입니다.

+0

내 질문에 대한 답변에서 내 의견에 답변했습니다. – EvgeniySharapov

관련 문제