【发布时间】:2023-03-31 11:53:01
【问题描述】:
我的多对多关系有问题。基本上,这就是我想要做的。 我有 2 个嵌套的多对多表,如下图所示。 Db diagram
编译我的代码时,我收到以下错误:
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'weeks0_.employee_project_employee_id' in 'field list'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003) ~[mysql-connector-java-8.0.18.jar:8.0.18]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.1.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.4.6.Final.jar:5.4.6.Final]
所以我知道我的周数有问题。
这是我的实体:
周:
package com.achsogo.rpt.entity;
import javax.persistence.*;
import java.util.Set;
@Entity
@Table(name="week")
public class Week {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int weekNumber;
private int year;
@OneToMany(mappedBy = "week", cascade = CascadeType.ALL, orphanRemoval = true, fetch =
FetchType.EAGER)
private Set<EmployeeProjectWeek> employeeProjects;
public Week() {
}
public Week(int weekNumber, int year) {
this.weekNumber = weekNumber;
this.year = year;
} //Getter and Setters
项目:
import javax.persistence.*;
import java.util.*;
@Entity
@Table(name = "project")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String alias;
private String pspElement;
private int contractValue;
private int plannedCost;
private int plannedHours;
private int assignedHours;
private Date startDate;
private Date endDate;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "project", orphanRemoval = true, fetch =
FetchType.EAGER)
private Set<ProjectAP> projectAPS;
@ManyToOne
private Department department;
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true, fetch =
FetchType.EAGER)
private Set<EmployeeProject> employees;
//Empty constructor
public Project(){}
//constructor for new project with default names
public Project(String alias){
this.alias = alias;
}
员工:
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String email;
private int employeeNumber;
private String acronym;
private int availability;
@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true, fetch =
FetchType.EAGER)
private Set<EmployeeProject> projects;
@ManyToOne
private Department department;
@ManyToOne
private Role role;
Project 和 Employee 之间的表(带有创建 ID 的类):
EmployeeProjectID:
@Embeddable
public class EmployeeProjectId implements Serializable {
private Long projectId;
private Long employeeId;
private EmployeeProjectId(){}
public EmployeeProjectId(Long projectId, Long employeeId){
this.employeeId = employeeId;
this.projectId = projectId;
}
EmployeeProject:这里是调用周数的地方(如果我没记错的话)
@Entity
@Table(name = "project_employee")
public class EmployeeProject {
@EmbeddedId
private EmployeeProjectId id;
@ManyToOne(fetch = FetchType.EAGER)
@MapsId("projectId")
private Project project;
@ManyToOne(fetch = FetchType.EAGER)
@MapsId("employeeId")
private Employee employee;
@Column(name = "amount_time")
private int amountTime = 0;
@Column(name = "is_project_leader")
private boolean isProjectLeader = false;
@OneToMany(mappedBy = "employeeProject", cascade = CascadeType.ALL, orphanRemoval = true, fetch =
FetchType.EAGER)
private Set<EmployeeProjectWeek> weeks;
public EmployeeProject(){}
现在是 Week 和 Employee Project 之间的表格:
EmployeeProjectWeekId:为嵌套的多对多表创建 ID:
@Embeddable
public class EmployeeProjectWeekId implements Serializable {
private EmployeeProjectId employeeProjectId;
private Long weekId;
private EmployeeProjectWeekId(){}
最后是 EmployeeProjectweek:
@Entity
@Table(name="project_employee_week")
public class EmployeeProjectWeek {
@EmbeddedId
private EmployeeProjectWeekId id;
@ManyToOne(fetch = FetchType.EAGER)
@MapsId("weekId")
private Week week;
@ManyToOne(fetch = FetchType.EAGER)
@MapsId("employeeProjectId")
private EmployeeProject employeeProject;
@Column(name="amount_time")
private int amountTime = 0;
@Column(name="is_project_leader")
private boolean isProjectLeader= false;
public EmployeeProjectWeek(Week week, EmployeeProject employeeProject) {
this.week = week;
this.employeeProject = employeeProject;
this.id = new EmployeeProjectWeekId(employeeProject.getId(), week.getId());
}
有人知道我在哪里出错了吗?提前感谢您的宝贵时间!
【问题讨论】:
标签: spring jpa nested many-to-many