JPA ManyToMany с собственной таблицей

У меня есть следующие объекты:

  • Project: id: int, name: String, работники: Set
  • Рабочий: id: int, name: String, projects: Set
  • Project_Worker: id: int, project_id: int, worker_id: int

Итак, у меня есть своя таблица, чтобы "решить" отношение многих к многим. <- ya Мне это нужно - не может использовать только многие, и пусть JPA создает таблицу, потому что мне нужен дополнительный объект.

Теперь я много пробовал. Просто чтобы JPA не создавала собственную таблицу и дополнительные столбцы и т.д., Но она не будет работать. Мой код:

@Entity
@Table("Worker")
public class Worker implements Serializable {
...
@ManyToMany
@JoinTable(name = "Project_Worker", 
 joinColumns = {@JoinColumn(name = "Worker_id", referencedColumnName="id")},
 inverseJoinColumns = {@JoinColumn(name = "project_id", referencedColumnName="id")})
private Set<project> projects;
</project>

Объект проекта выглядит одинаково. только с измененными столбцами соединения.

Моя таблица: столбцы Project_Worker имеют в настоящий момент никаких аннотаций, если я использую например:

@JoinTable(name="Project",
 joinColumns = {@JoinColumn(name = "id")})

JPA создает в рабочей таблице и таблице проекта дополнительный столбец вместо этого в таблице Project_Worker.

Поэтому я просто хочу сопоставить отношение "многие-ко-многим" по моей собственной таблице с моими собственными атрибутами.

Я также пробовал решение, которое работало, - что только таблица project_worker будет иметь аннотации OneToMany, но поэтому объект проекта и работника не сможет использовать Set, и я должен смотреть каждый раз в таблице project_worker для правой строки...

1 ответ

Если вы хотите сопоставить его как многостраничного Project <-> Worker через вашу таблицу соединений, вам нужно будет выровнять столбец id в таблице project_worker, и он должен работать так, как вы ожидаете.

Если вы не можете этого сделать, вам понадобится ProjectWorker как сущность в коде, тогда отношения должны быть "один ко многим" от "Работник" и "Проект к ProjectWorker".

@Entity
@Table("Worker")
public class Worker implements Serializable {
...
@OneToMany(mappedBy = "worker")
private Set<projectworker> projectWorker;


@Entity
@Table("Project")
public class Project implements Serializable {
...
@OneToMany(mappedBy = "project")
private Set<projectworker> projectWorker;


@Entity
@Table("ProjectWorker")
public class ProjectWorker implements Serializable {
...
@ManyToOne
@JoinColumn(name = "worker_id")
private Worker worker;

@ManyToOne
@JoinColumn(name = "project_id")
private Project project;
</projectworker></projectworker>

licensed under cc by-sa 3.0 with attribution.