Spring Boot错误:@OneToOne或@ManyToOne引用了未知实体



我是一名物理工程师,我必须对地震进行一些研究,为此我正在构建一个软件来执行一些计算。我有java和android的经验,但我在Spring Boot框架方面遇到了一些困难。我需要将一些重要的地震发送到MySql数据库,以便对其进行分析。我有两个实体,一个用于地震,另一个用于震中附近的距离列表。目前,我的问题存在于@OneToMany和@ManyToOne关系中,错误就是从这两个关系开始的。我还为每个实体提供了如下DTO:地震实体:

@Entity(name = "earthquakes")
public class EarthquakeEntity implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(nullable = false)
private String earthquakeId;
@Column(nullable = false)
private float magnitude;
@Column(nullable = false, length = 120)
private String region;
@Column(nullable = false, length = 50)
private String dateTime;
@Column(nullable = false, length = 50)
private String location;
@Column(nullable = false, length = 50)
private Integer depth;
@OneToMany(mappedBy = "earthquakeDetails", cascade = CascadeType.ALL)
private List<DistancesEntity> distances;
// getters and setters
}

地震DTO:

public class EarthquakeDto implements Serializable {
private long id;
private String earthquakeId;
private float magnitude;
private String region;
private String dateTime;
private String location;
private Integer depth;
private List<DistanceDto> distances;

// getters and setters
}

对于距离:远程实体:

@Entity(name = "distances")
public class DistancesEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false, length = 30)
private String distanceId;
@Column(nullable = false, length = 120)
private String distance;
@Column(nullable = false, length = 50)
private Integer population;
@Column(nullable = false, length = 50)
private String localTime;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "earthquakes_id", nullable = false)
private EarthquakeDto earthquakeDetails;

// getters and setters
}

距离DTO:

public class DistanceDto implements Serializable {
private long id;
private String distanceId;
private String distance;
private Integer population;
private String localTime;
private EarthquakeDto earthquakeDetails;
// getters and setters
}

在我的服务中,我有将地震添加到数据库的逻辑,EarthquakeServiceImpl.java

Override
public EarthquakeDto addEarthquake(EarthquakeDto earthquake) {
for (int i = 0; i < earthquake.getDistances().size(); i++) {
DistanceDto distance = earthquake.getDistances().get(i);
distance.setEarthquakeDto(earthquake);
distance.setDistanceId(utils.generateQuakeDistanceID(30));
earthquake.getDistances().set(i, distance);
}
ModelMapper modelMapper = new ModelMapper();
EarthquakeEntity earthquakeEntity = modelMapper.map(earthquake, EarthquakeEntity.class);
String earthquakeId = utils.generateEarthquakeID(30);
earthquakeEntity.setEarthquakeId(earthquakeId);
EarthquakeEntity addedEarthquakes = earthquakeRepository.save(earthquakeEntity);
EarthquakeDto returnQuake = modelMapper.map(addedEarthquakes, EarthquakeDto.class);
return returnQuake;
}

和我的控制器

@PostMapping(consumes = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE },
produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
public EarthquakeRest addEarthquake(@RequestBody EarthquakeRequestModel earthquakeDetails) throws Exception {
EarthquakeRest earthquakeRest = new EarthquakeRest();
ModelMapper modelMapper = new ModelMapper();
EarthquakeDto quakeDto = modelMapper.map(earthquakeDetails, EarthquakeDto.class);
EarthquakeDto addedEarthquake = earthquakeService.addEarthquake(quakeDto);
earthquakeRest = modelMapper.map(addedEarthquake, EarthquakeRest.class);
return earthquakeRest;
}

在决定发布关于堆栈溢出的问题之前,我做了一些研究,但没有一个对我有效。这个错误似乎与hibernate有关,我仔细检查了是否从javax.persistence和maven依赖项导入了注释。一切似乎都很好,但错误仍然存在:

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.physicslab.Physics.Lab.io.entity.DistancesEntity.earthquakeDetails references an unknown entity: com.physicslab.Physics.Lab.shared.dto.EarthquakeDto

和另一个

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.physicslab.Physics.Lab.io.entity.DistancesEntity.earthquakeDetails references an unknown entity: com.physicslab.Physics.Lab.shared.dto.EarthquakeDto

我需要一些关于我做错了什么或者我是否做了一个糟糕的练习的建议。如果我在这里做了一些令人痛苦的事情,我也会发布我的maven依赖关系:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.physicslab</groupId>
<artifactId>Physics-Lab</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Physics-Lab</name>
<description>Project and laboratory management for physics projects</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<jjwt.version>0.6.0</jjwt.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
<dependency>
<groupId>org.modelmapper.extensions</groupId>
<artifactId>modelmapper-spring</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.passay</groupId>
<artifactId>passay</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.1</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

也许有人可以建议我读一些关于Spring Boot Framework的书,因为教程的处理方式不同,并且不能很好地理解这些概念。提前感谢

正如错误所示,您正在另一个JPA实体中注释(引用(一个非持久性类型。

EarthquakeEntity应该是映射类型,而不是EarthquakeDto:

@Entity(name = "distances")
public class DistancesEntity implements Serializable {
// other fields
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "earthquakes_id", nullable = false)
private EarthquakeEntity earthquakeDetails;

// getters and setters
}

然后,您应该配置ModelMapper,以便在将EarthquakeDto映射到EarthquakeEntity实例时,DistanceDto也会自动映射到DistanceEntity

请注意,您的问题与Spring框架本身无关,并且是一个纯粹的JPA-Hibernate错误

最新更新