Отображение 3 сущностей через общую таблицу мостов с использованием Hibernate - PullRequest
0 голосов
/ 27 октября 2018

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

Я использую 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);

}

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Я думаю, что вопрос заслуживает внимания.

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

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

Команда A может знать, что Персона A имеет Навык VB. Команда B не должна знать, что Лицо A имеет Навык VB.

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

0 голосов
/ 30 октября 2018

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

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

0 голосов
/ 27 октября 2018

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

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

  • Человек и Умение
  • Команда и Персона

Свойство skill на Team level должно быть получено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...