2016-07-27 17 views
0

一般的な属性を持つエンティティが2つあります。そのため、以下のような共通のパラメータが抽出されました。JPA ManyToOneマッピングwith継承

@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を使用する場合は、このマッピング(私はそれがほとんどのデータベースで予約語として何か他にGROUPを変更しなければならなかったの通知)で逃げることができ

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

EntityでBase型を作成することに興味がありません。ここでは、同じフィールドを継承するBusinessCustomerという別の型があるため、静的にIndividualCustomerに型を設定すると機能しない場合があります。 –

+0

PS:試した@Inheritance(戦略= InheritanceType.TABLE_PER_CLASS)、申し訳ありませんでした –