2014-09-01 2 views
1

나는이 일을했다는 것을 믿고 나는 무언가를 했음에 틀림 없다. 바라건대, 누군가 즉시 문제를 볼 수 있습니다.JPA 판별 자 값을 매핑하는 방법은 무엇입니까?

상속 관계에있는 두 개의 클래스. 놀이에 두 테이블입니다. 두 테이블 모두 레코드를 수신합니다. 손에 문제 : discriminator 값이 저장되지 않았습니다.

부모 클래스

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="entp", discriminatorType=DiscriminatorType.STRING) 
@Table(name="enrg") 
public abstract class BaseEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="enid") 
    private Long entityId; 

    // some string property mapped to column 'nm; 
    // some string property mapped to column 'ns; 
    // some string property mapped to column 'tmcr; 

하위 클래스

@Entity 
@DiscriminatorValue("ws") 
@Table(name="ws") 
public class Website extends BaseEntity { 
    private static final long serialVersionUID = 1L; 

    @Column(name="exdr", length=100) 
    private String exportDirectory; 

서비스 호출

getEntityManager().persist(website); 

SQL

Hibernate: insert into enrg (nm, ns, tmcr) values (?, ?, ?) 
Hibernate: insert into ws (exdr, enid) values (?, ?) 

최대 절전 모드

<persistence-unit name="prod" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>prodDataSource</jta-data-source> 

    <class>webadmin.domain.core.Website</class> 

    <exclude-unlisted-classes>false</exclude-unlisted-classes> 

    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name = "hibernate.show_sql" value = "true" /> 
     <property name = "hibernate.discriminator.ignore_explicit_for_joined" value = "false" /> 
    </properties> 

</persistence-unit> 

, 최대 절전 모드는 Enrg의 삽입에 entp 열/값을 포함 무엇을 가지고 내가 어떻게해야합니까? 이 경우, entp 값은 'ws'여야합니다.

솔루션

내 모든 매핑/구성은 위와 같이 남아있다. 하이버 네이트 4.3.6으로 업그레이드했고 TomEE 1.7에서이 기능이 작동합니다.

Hibernate: insert into enrg (nm, ns, tmcr, entp) values (?, ?, ?, 'ws') 
Hibernate: insert into ws (exdr, enid) values (?, ?) 
+0

Hibernate가 JOINED 전략에서 discriminator를 지원하지 않으면 많은 JPA 제공자가 있다는 것을 확신합니다. –

답변

1

thisthis 도움을한다.

결국 SINGLE_TABLE 전략은 discriminator 열이 필요하고, JOINED은 구현할 수 없습니다. 현재 최대 절전 모드의 문제점은 JOINED으로 판별자를 사용하면 JPA 사양에서 식별자 값을 유지하도록 권장하더라도 @DiscriminatorColumn으로 매핑 된 JOINED 상속의 하위 엔터티를 유지할 때 일관성없는 데이터가 발생한다는 것입니다.

+0

최대 절전 모드에 대해 더 많이 읽을수록 그다지 좋아하지 않습니다. 솔직히, 라이브러리 구현에 묻혀있는 문제를 읽고 해결하는 것보다 준비된 명령문을 수동으로 관리하는 데 훨씬 적은 시간이 걸립니다. – jacekn

+0

@jacekn 예, Hibernate 하에서 만'statement'와'perpared statement'가 정확 합니다만,'Hibernate'는 세션 관리, 캐싱 등과 같이 훨씬 더 많은 것을 제공합니다. 더 많이 읽고 구현해야합니다. : P –

+0

@jacekn는 [여기] (https://hibernate.atlassian.net/browse/HHH-6911)를 보았고, DiscriminatorValue 대신 DiscriminatorColumn을 사용해 보았습니다. –

관련 문제