gpt4 book ai didi

java - 带有继承的 JPA ManyToOne 映射

转载 作者:行者123 更新时间:2023-12-01 09:38:54 25 4
gpt4 key购买 nike

我有几个实体,它们具有共同的属性,因此提取了共同的参数,如下面的代码片段。

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

}

相同的 OneToMany 映射会在 statrtup 期间导致 Hibernate 异常,如下所示。

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

不是这样的@MappedSuperclass应该使用吗?

最佳答案

您无法将关系映射到@MappedSuperclass。请查看引用文档here@MappedSuperclass 允许您仅在域模型中实现继承。从数据库的角度来看,这使其成为一个实现细节。 @MappedSuperclass 可以轻松地将公共(public)字段和注释分组到通常抽象的父类(super class)中,但您无法与它建立关系。

如果您使用@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;

}

关于java - 带有继承的 JPA ManyToOne 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com