2016-07-27 64 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期間休眠異常相同的結果的一對多映射。

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 堆棧:春季啓動與Spring數據JPA

+0

你是否試圖讓它抽象? –

+0

剛剛嘗試過,沒有運氣 –

+0

'@OneToMany(fetch = FetchType。LAZY,mappedBy =「group」) 私人列表 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(無變化)

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

對實體中的Base類型不感興趣,在這裏我有另一種類型的BusinessCustomer,它繼承了相同的字段,因此靜態地將它輸入到IndividualCustomer可能不起作用。 –

+0

PS:試過@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS),抱歉沒有工作 –