Я хочу смоделировать тот факт, что для работы команде требуется несколько навыков. Многие люди могут обладать определенными навыками. У человека много навыков. Человек может быть частью многих команд.
Я использую 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);
}
Боюсь, вы не можете этого сделать. Эта модель содержит логическую непоследовательность и может привести к противоречиям. Представьте, что у вас есть TeamA, который содержит 2 члена (PersonA, PersonB). PersonA содержит Навык А, а PersonB содержит SkillB. Это означает, что TeamA должен содержать 2 навыка (Навык А и SkillB). Однако ваша модель должна позволять развивать навыки на уровне команды независимо от ее членов. Что бы произошло тогда, если бы вы поместили только Навык А в свойство навыки и уменияTeamA?
Я думаю, вам следует оставить отношения "многие-ко-многим" между
Должно быть получено свойство навыки и умения на уровне Команда.
Я думаю, что вопрос имеет смысл.
Использование общей таблицы мостов между тремя объектами позволяет обеспечить безопасность на уровне строк, предполагая, что команда может видеть только те компетенции, которые они добавляют сами.
Возьмем, к примеру, консультанта, работающего с VB в одной команде. Ей действительно не нравится VB, и она не хочет, чтобы другая команда знала, что у нее есть этот навык.
Команда А может знать, что Человек А имеет Навык VB. Команда B не должна знать, что Человек A имеет Навык VB.
Я бы добавил это как комментарий, но у меня нет необходимой репутации = /
Один из способов решить эту проблему - создать объект, который существует исключительно как мост. Таким образом, вы можете добавить три различных отношения «один ко многим» между вашими «реальными» объектами и объектом-мостом. Таким образом, вы сможете справиться с трехсторонним отношением «многие ко многим».
Однако вам, вероятно, придется обрабатывать данные в объекте моста «вручную».