Spring JPA 2 вложил много в многие отношения - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблема с отношениями многие ко многим. По сути, вот что я пытаюсь сделать. У меня есть 2 много ко многим таблицам, которые являются вложенными, как видно на следующем изображении. Диаграмма базы данных

При компиляции моего кода я получаю следующую ошибку:

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;

Таблица между Проектом и Сотрудником (с классом для создания идентификатора):

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(){}

А теперь таблица между неделей и проектом Employee:

EmployeeProjectWeekId: для создания идентификатора для вложенной таблицы «многие ко многим»:

@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());
}

Кто-нибудь знает, где я сделал ошибку? Заранее спасибо за ваше время!

1 Ответ

0 голосов
/ 19 февраля 2020

Это была проблема с именами. Я решил это, отбросив все таблицы в моей БД и имея Spring для автоматического создания таблиц. Теперь все работает хорошо.

Я ввел следующие строки в своем приложении .properties:

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