2016-07-27 7 views
0

공통 속성을 가진 두 개의 엔티티가 있으므로 아래 스 니펫과 같은 공통 매개 변수가 추출됩니다.JPA ManyToOne 매핑 (상속 포함)

@MappedSuperclass() 
public class BaseCustomerDemographicDetails { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected long id; 

    @ManyToOne 
    @JoinColumn(name = "GROUP") 
    protected Group group; 

} 

엔티티 스 니펫은 다음과 같습니다.

@Entity 
@Table(name = "INDIVIDUAL_CUSTOMER") 
@Access(AccessType.FIELD) 
public class IndividualCustomer extends BaseCustomerDemographicDetails { 

    @NotNull 
    @Embedded 
    private PersonalInformation personalInformation; 

    @Column(precision = 16, scale = 2) 
    private BigDecimal annualIncome; 

    private Boolean vip; 

    private Boolean isStaff; 

... 
} 

@Entity 
    @Access(AccessType.FIELD) 
    @Table(name = "GROUP") 
    public class Group { 

     protected Group(){} 

     @Id 
     @NotNull 
     @Column(name = "GROUPID") 
     private String groupId; 

     @NotNull 
     @Column(name="GROUPNAME") 
     private String groupName; 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "group") 
     private List<BaseCustomerDemographicDetails> customerDemographicDetails; 

    } 

아래 statrtup 동면 예외 동일한 결과의 OneToMany 매핑.

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1249) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:120) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:860) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) 
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) 
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) 
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
... 16 common frames omitted 
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: xx.xxx.xxxxxxx.xxxxxxxxx.domain.model.Group.customerDemographicDetails[xx.xxx.xxxxx.xxxxxxx.domain.model.BaseCustomerDemographicDetails] 
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1135) 
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:794) 
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:729) 
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:70) 
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697) 
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846) 
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857) 
... 24 common frames omitted 

공식 문서는 내가 시도한 것과 동기화되었지만 아직 행운이 없다.

http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html 스택 : 스프링 데이터 JPA

+0

당신은 추상적으로 만들려고 했습니까 ?? –

+0

방금 ​​시도했습니다. –

+0

'@OneToMany (fetch = FetchType. 개인 목록 customerDemographicDetails; ' –

답변

1

관계를 @MappedSuperclass에 매핑 할 수 없습니다. 참조 문서 here을보십시오. @MappedSuperclass을 사용하면 도메인 모델에서만 상속을 구현할 수 있습니다. 이는 데이터베이스 관점에서 구현 세부 사항으로 만듭니다. @MappedSuperclass은 일반적으로 추상적 인 수퍼 클래스에서 공통 필드와 특수 효과를 쉽게 그룹화 할 수 있지만 관계를 설정할 수는 없습니다. 당신이 @Inheritance를 사용하는 경우

,이 매핑 ​​도망 (이것은 대부분의 데이터베이스에서 예약어이기 때문에 내가 뭔가 다른 그룹을 변경했다 통지) 할 수 있습니다

BaseCustomerDemographicDetails.java

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Inheritance; 
import javax.persistence.InheritanceType; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 

@Entity(name = "BaseCustomerDemographicDetails") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public class BaseCustomerDemographicDetails { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected long id; 

    @ManyToOne 
    @JoinColumn(name = "GROUP_OF_CUSTOMERS") 
    protected Group groupOfCustomers; 

} 

Group.java

import java.util.List; 
import javax.persistence.Access; 
import javax.persistence.AccessType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.validation.constraints.NotNull; 

@Entity 
@Access(AccessType.FIELD) 
@Table(name = "GROUP_OF_CUSTOMERS") 
public class Group { 

    protected Group() { 
    } 

    @Id 
    @NotNull 
    @Column(name = "GROUPID") 
    private String groupId; 

    @NotNull 
    @Column(name = "GROUPNAME") 
    private String groupName; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "groupOfCustomers") 
    private List<BaseCustomerDemographicDetails> customerDemographicDetails; 

} 

IndividualCustomer.java (변경 없음)

,617,
import java.math.BigDecimal; 
import javax.persistence.Access; 
import javax.persistence.AccessType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
@Access(AccessType.FIELD) 
public class IndividualCustomer extends BaseCustomerDemographicDetails { 

    @NotNull 
    @Embedded 
    private PersonalInformation personalInformation; 

    @Column(precision = 16, scale = 2) 
    private BigDecimal annualIncome; 

    private Boolean vip; 

    private Boolean isStaff; 

} 
0

문제 봄 부팅이 정확히 무엇을하는 것은 그것이 말했다. 유효하지 않습니다 :

private List<BaseCustomerDemographicDetails> customerDemographicDetails; 

BaseCustomerDemographicDetails은 엔티티가 아닙니다. 변경하려면

private List<IndividualCustomer> customerDemographicDetails; 

으로 변경하십시오.

-

편집 : 당신이 정말로 BaseCustomerDemographicDetails를 사용하려는 경우, 당신은 또한 엔티티 만들고, @Inheritance를 사용해야합니다,하지만 난 그것을 경험이 없습니다.

+0

입니다. 엔티티의 기본 유형을 만드는 데 관심이 없습니다. 여기에 같은 필드를 상속하는 BusinessCustomer라는 다른 유형이 있으므로 IndividualCustomer에 정적으로 입력하면 작동하지 않을 수 있습니다. –

+0

추신 : 시도한 @ 상속 (strategy = InheritanceType.TABLE_PER_CLASS), 미안하지만 작동하지 않았습니다. –