具有复合PK的JPA@JoinTable和@JoinColumn不起作用



你好,当我在两个实体(其中一个实体带有复合主键)之间执行JoinTable时,我很难理解错误。

我的实体:


@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "meds")
public class Meds {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column
private String name;

@Column
private BigDecimal price;

@Column
private String category;

@Column
private int pillNumber;

@Column
private Date date;

@JsonIgnore
@ManyToMany(mappedBy = "assignedMeds")
private Set<Plans> plans = new HashSet<>();

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "plans")
@IdClass(PlansPKId.class)
public class Plans {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long planId;

@Id
@Column
private Date planDate; // format: yyyy-mm-dd

@Column
private String planName;

@Column
private String weekday;

@ManyToMany
@JoinTable(name = "Plan_Meds", joinColumns = @JoinColumn(name = "planDate", referencedColumnName = "planId"), inverseJoinColumns = @JoinColumn(name = "id"))
private Set<Meds> assignedMeds = new HashSet<>();

}

我的PlansPKId类:


@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class PlansPKId implements Serializable {

private long planId;

private Date planDate; // format: yyyy-mm-dd
}

我的错误:

org.springframework.beans.factory.BeanCreationException:使用类路径资源[org/springframeter/boot/autoconfig/orm/jpa/Hibernate JpaConfiguration.class]中定义的名称"entityManagerFactory"创建bean时出错:调用init方法失败;嵌套异常为org.hubinate.AnnotationException:无法映射集合com.MD.Medicine.Models.Plans.assignedMeds在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)~[spring-beans-5.323.jar:5.3.23]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)~[spring-beans-5.323.jar:5.3.23]网址:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)~[spring-beans-5.323.jar:5.3.23]在org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)~[spring-beans-5.323.jar:5.3.23]位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)~[spring-beans-5.323.jar:5.3.23]网址:org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)~[spring-beans-5.323.jar:5.3.23]在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory:java:208)~[spring-beans-5.323.jar:5.3.23]网址:org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)~[spring-context-5.3.23.jar:5.3.23]位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)~[spring-context-5.3.23.jar:5.3.23]网址:org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)~[spring-context-5.3.23.jar:5.3.23]网址:org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplication context.java:147)~[spring-boot-2.7.5.jar:2.7.5]网址:org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)~[spring-boot-2.7.5.jar:2.7.5]网址:org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)~[spring-boot-2.7.5.jar:2.7.5]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:308)~[spring-boot-2.7.5.jar:2.7.5]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)~[spring-boot-2.7.5.jar:2.7.5]网址:org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)~[spring-boot-2.7.5.jar:2.7.5]网址:com.MD.Medicine.MedicineApplication.main(MedicineApp.java:10)~[classes/:na]由:org.hubinate.AnnotationException:无法映射集合com.MD.Medicine.Models.Plans.assignedMeds位于org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1750)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1475)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:901)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]在org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:826)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1653)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1629)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]网址:org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBBuilderImpl.java:1460)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBBuilderImpl.java:1494)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]网址:org.springframework.om.jpa.vendor.SpringHibernate JpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernate jpa PersistenceProvider.java:58)~[spring-orm-5.3.23.jar:5.3.23]位于org.springframework.om.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManager FactoryBean.java:365)~[spring-orm-5.3.23.jar:5.3.23]在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)~[spring-orm-5.3.23.jar:5.3.23]在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)~[spring-orm-5.3.23.jar:5.3.23]在org.springframework.om.jpa.LocalContainerEntityManagerFactoryBean.fafterPropertiesSet(LocalContainerEntityManager FactoryBean.java:341)~[spring-orm-5.3.23.jar:5.3.23]网址:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)~[spring-beans-5.323.jar:5.3.23]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)~[spring-beans-5.323.jar:5.3.23]…省略了16个常用帧由:org.hubinate.AnnotationException引起:com.MD.Medicine.Models.Meds.assignedMeds的referencedColumnNames(planId)引用com.MD.Mediane.Models.Plans未映射到单个属性位于org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:203)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]位于org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1740)~[hibernate-core-56.6.12.Final.jar:5.6.2.Final]…32个普通帧省略

我尝试了@JoinColumn(name="planDate",referencedColumnName="planId"),也尝试了另一种方法,首先使用planId,但同样的事情发生了。可能出了什么问题?当做

不想在Plans类中使用复合ID:planId已经是唯一的,并且由数据库生成。但这不是映射所有列id planDate和planId所需要的问题。

@ManyToMany
@JoinTable(name = "Plan_Meds", joinColumns = {
@JoinColumn(name = "planDate", referencedColumnName = "planDate")
@JoinColumn(name = "planId", referencedColumnName = "planId")
}, inverseJoinColumns = @JoinColumn(name = "id"))
private Set<Meds> assignedMeds = new HashSet<>();

相关内容

最新更新