主要是我想建立一種多對一的關系。這種關系是許多汽車歸一個車主所有。
這是我的錯誤:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.javatech.crud.example.entity.Car.owners references an unknown entity: java.util.List
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.14.jar:5.3.14]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.14.jar:5.3.14]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.14.jar:5.3.14]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.2.jar:2.6.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.2.jar:2.6.2]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.2.jar:2.6.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.2.jar:2.6.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.2.jar:2.6.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) ~[spring-boot-2.6.2.jar:2.6.2]
at com.javatech.crud.example.SpringBootCrudManyToOneExampleApplication.main(SpringBootCrudManyToOneExampleApplication.java:10) ~[classes/:na]
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.javatech.crud.example.entity.Car.owners references an unknown entity: java.util.List
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:100) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1750) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1694) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.14.jar:5.3.14]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.14.jar:5.3.14]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.14.jar:5.3.14]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.14.jar:5.3.14]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.14.jar:5.3.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.14.jar:5.3.14]
... 16 common frames omitted
這是專案的應用程式類:
package com.javatech.crud.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootCrudManyToOneExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootCrudManyToOneExampleApplication.class, args);
}
}
這是我的汽車物體類:
package com.javatech.crud.example.entity;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="Car_TBL")
public class Car {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String modelName;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_owner_id")
private List<Owner> owners;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public List<Owner> getOwners() {
return owners;
}
public void setOwners(List<Owner> owners) {
this.owners = owners;
}
}
這是我的所有者物體類:
package com.javatech.crud.example.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="Owner_TBL")
public class Owner {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private String location;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
這是所有者存盤庫介面:
package com.javatech.crud.example.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.javatech.crud.example.entity.Owner;
@Repository
public interface OwnerRepository extends JpaRepository<Owner, Integer> {
public List<Owner> findByName(String name);
}
這是 Car Repository 界面:
package com.javatech.crud.example.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.javatech.crud.example.entity.Car;
@Repository
public interface CarRepository extends JpaRepository<Car, Integer> {
}
這是所有者控制器類:
package com.javatech.crud.example.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.javatech.crud.example.entity.Owner;
import com.javatech.crud.example.service.OwnerService;
@RestController
public class OwnerController {
@Autowired
private OwnerService service;
@PostMapping("/addcars")
public void addCars(@RequestBody Owner owner){
service.save(owner);
}
}
這是所有者服務類:
package com.javatech.crud.example.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.javatech.crud.example.entity.Owner;
import com.javatech.crud.example.repository.CarRepository;
import com.javatech.crud.example.repository.OwnerRepository;
@Service
public class OwnerService {
@Autowired
private CarRepository carrepository;
@Autowired
private OwnerRepository ownerrepository;
public void save(Owner owner) {
List<Owner> owners = ownerrepository.findByName(owner.getName());
if(owners.isEmpty()) {
ownerrepository.save(owner);
}
}
}
uj5u.com熱心網友回復:
在 List 的一側,你必須使用 @OneToMany 而不是 @ManyToOne
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_owner_id")
private List<Owner> owners;
uj5u.com熱心網友回復:
查看例外:
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.javatech.crud.example.entity.Car.owners references an unknown entity: java.util.List
這意味著,它不會將所有者欄位識別為物體。要更正它,請通過添加以下內容來完成關系:
@JoinColumn(name = "some FK column")
private Car car;
在所有者類中。
此外,在Car類中,
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_owner_id")
private List<Owner> owners;
這似乎不正確。可能您想模擬“一輛車可以有很多車主”的關系。如果是,請更正為:
@OneToMany(targetEntity = Car.class, cascade = CascadeType.ALL)
@JoinColumn(name = "fk_owner_id")
private List<Owner> owners;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/400964.html
