Отображение 3 сущностей через общую таблицу мостов с использованием Hibernate

Я хочу смоделировать тот факт, что для работы команде требуется несколько навыков. Многие люди могут обладать определенными навыками. У человека много навыков. Человек может быть частью многих команд.

Я использую Hibernate для моделирования этого сценария. Я начал создавать с двумя сущностями, командой и навыком, и использовал аннотацию @ManyToMany, чтобы связать эти зависимости. Попытка добавить третью сущность, человека, оказалась затруднительной. Я не понимаю, как мне построить эту модель, и буду очень признателен за любую помощь.

У меня нет большого опыта использования Hibernate, поэтому это проблема.

Я искал информацию, и большинство примеров, которые я нашел, касались двух связанных сущностей, и я не смог масштабировать эти примеры, чтобы включить третью сущность.

Это мои сущности:

package com.example.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
public class Team {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToMany
    private Set<Skill> skills;

    @ManyToMany
    private Set<Person> persons;
}



package com.example.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.Set;

@Entity
public class Skill {
    @Id
    @GeneratedValue
    private Long id;

    private String knowHow;

    @ManyToMany
    private Set<Team> teams;

    @ManyToMany
    private Set<Person> persons;
}



package com.example.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.Set;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private Set<Team> teams;
    private Set<Skill> skills;
}

Это мои репозитории:

package com.example.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.entity.Competence;
import com.example.entity.Team;

import java.util.List;

@Repository
public interface TeamRepository extends CrudRepository<Team, Long> {
    List<Competence> findDistinctByKnowHow(String name);
}



package com.example.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.entity.Competence;
import com.example.entity.Skill;

import java.util.List;

@Repository
public interface SkillRepository extends CrudRepository<Skill, Long> {

    List<Competence> findDistinctByKnowHow(String knowHow);

}



package com.example.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.entity.Competence;
import com.example.entity.Person;

import java.util.List;

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {

    List<Competence> findDistinctByPerson(String name);

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
276
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Боюсь, вы не можете этого сделать. Эта модель содержит логическую непоследовательность и может привести к противоречиям. Представьте, что у вас есть TeamA, который содержит 2 члена (PersonA, PersonB). PersonA содержит Навык А, а PersonB содержит SkillB. Это означает, что TeamA должен содержать 2 навыка (Навык А и SkillB). Однако ваша модель должна позволять развивать навыки на уровне команды независимо от ее членов. Что бы произошло тогда, если бы вы поместили только Навык А в свойство навыки и уменияTeamA?

Я думаю, вам следует оставить отношения "многие-ко-многим" между

  • Человек и Навык
  • Команда и Человек

Должно быть получено свойство навыки и умения на уровне Команда.

Я думаю, что вопрос имеет смысл.

Использование общей таблицы мостов между тремя объектами позволяет обеспечить безопасность на уровне строк, предполагая, что команда может видеть только те компетенции, которые они добавляют сами.

Возьмем, к примеру, консультанта, работающего с VB в одной команде. Ей действительно не нравится VB, и она не хочет, чтобы другая команда знала, что у нее есть этот навык.

Команда А может знать, что Человек А имеет Навык VB. Команда B не должна знать, что Человек A имеет Навык VB.

Я бы добавил это как комментарий, но у меня нет необходимой репутации = /

Ответ принят как подходящий

Один из способов решить эту проблему - создать объект, который существует исключительно как мост. Таким образом, вы можете добавить три различных отношения «один ко многим» между вашими «реальными» объектами и объектом-мостом. Таким образом, вы сможете справиться с трехсторонним отношением «многие ко многим».

Однако вам, вероятно, придется обрабатывать данные в объекте моста «вручную».

Другие вопросы по теме