【问题标题】:Spring JPA 2 nested many to many relationshipSpring JPA 2 嵌套多对多关系
【发布时间】: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


    【解决方案1】:

    这是一个命名问题。我通过删除数据库中的所有表并让 Spring 自动生成表来解决这个问题。现在一切正常。

    我在 application.properties 中输入了以下几行:

    spring.jpa.hibernate.ddl=true
    spring.jpa.hibernate.ddl-auto=update
    

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多