2016-07-27 17 views
0

Haben Sie ein paar Entitäten, die gemeinsame Attribute haben, extrahiert daher die allgemeinen Parameter wie das folgende Snippet.JPA ManyToOne Mapping mit Vererbung

@MappedSuperclass() 
public class BaseCustomerDemographicDetails { 

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

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

} 

Die Entity-Snippets sind wie folgt.

@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; 

    } 

OneToMany Die Abbildung der gleichen Ergebnisse in den Ruhezustand Ausnahme wie unten während 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 

Die offizielle Dokumentation ist synchron mit dem, was ich versucht habe, aber ohne Glück, bitte helfen Sie mir !!!!

http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html Stack: Frühlings-Stiefel mit Spring Data JPA

+0

hast du versucht, es abstrakt zu machen? –

+0

Nur versucht, kein Glück –

+0

'@OneToMany (fetch = FetchType.LAZY, mappedBy = "Gruppe") private Liste customerDemographicDetails; ' –

Antwort

1

Sie können keine Beziehung zu einer @MappedSuperclass zuordnen. Bitte beachten Sie die Referenzdokumentation here. @MappedSuperclass können Sie die Vererbung nur im Domänenmodell implementieren. Das macht es zu einem Implementierungsdetail, aus Sicht der Datenbank. @MappedSuperclass macht es einfach, allgemeine Felder und Anmerkungen in einer normalerweise abstrakten Oberklasse zu gruppieren, aber Sie können keine Beziehungen zu ihm herstellen.

Wenn Sie @Inheritance verwenden, können Sie mit dieser Zuordnung (merke ich GROUP auf etwas anderes musste sich ändern, da es ein reserviertes Wort in den meisten Datenbanken ist) weg:

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 (keine Änderung)

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

Das Problem ist genau das, was ist, sagt es ist. Dies ist ungültig:

private List<BaseCustomerDemographicDetails> customerDemographicDetails; 

als BaseCustomerDemographicDetails ist keine Einheit. Ändern Sie es in

private List<IndividualCustomer> customerDemographicDetails; 

und es sollte funktionieren.

-

Edit: Wenn Sie wirklich BaseCustomerDemographicDetails verwenden möchten, müssen Sie es auch eine Einheit machen, und verwenden @Inheritance, aber ich habe keine Erfahrung damit.

+0

I bin nicht daran interessiert, den Base-Typ in Entity zu machen, hier habe ich einen anderen Typ namens BusinessCustomer, der die gleichen Felder erbt, so dass es statisch nicht möglich ist, ihn auf IndividualCustomer zu tippen. –

+0

PS: versuchte @Inheritance (Strategie = InheritanceType.TABLE_PER_CLASS), sorry hat nicht funktioniert –

Verwandte Themen