【发布时间】:2016-04-11 18:59:54
【问题描述】:
我有一个 JPA 实体 Person 和一个实体 Team。从逻辑上讲,Person 和 Team 具有 ManyToMany 关系。但是因为我有一个附加属性,即团队中人员的角色,它限定了关系,我必须将关系建模为与联合实体的两个关系,我称之为PersonToTeam。代码如下:
public class Person {
@Id
private String id;
private String name;
@OneToMany(mappedBy = "id.person", cascade = { CascadeType.ALL })
private List<PersonToTeam> teamAssociations = new ArrayList<>();
}
public class Team {
@Id
private String id;
private String name;
@OneToMany(mappedBy = "id.team", cascade = { CascadeType.ALL })
private List<PersonToTeam> teamAssociations = new ArrayList<>();
}
public class PersonToTeam {
@EmbeddedId
private PersonToTeamId id = new PersonToTeamId();
private RoleInTeam role;
public enum RoleInTeam {
ADMIN, MEMBER
}
}
public class PersonToTeamId implements Serializable {
private static final long serialVersionUID = -8450195271351341722L;
@ManyToOne
private Person person;
@ManyToOne
private Team team;
}
到目前为止一切顺利。但我不喜欢将管理员添加到团队中的努力。这看起来像:
Person person = new Person();
person.setId("d022051");
person.setName("Gregor Frey");
personRepo.save(person);
Team team = new Team();
team.setId("SpringTutorial");
team.setName("Spring Tutorial");
PersonToTeam assoc = new PersonToTeam();
assoc.getId().setPerson(person);
assoc.getId().setTeam(team);
assoc.setRole(RoleInTeam.ADMIN);
List<PersonToTeam> teamAssociations = person.getTeamAssociations();
teamAssociations.add(assoc);
List<PersonToTeam> personAssociations = team.getTeamAssociations();
personAssociations.add(assoc);
teamRepo.save(team);
我想要一个方法 addAdminToTeam,它接受一个人,创建一个新的 personToTeam 关联并将其添加到团队中的关联人员集合中。
我的问题是:我应该把这个方法放在哪里?在实体中,作为临时设置者?在存储库中(这可能吗)?还是在单独的服务对象中?还有其他方法可以简化程序吗?
【问题讨论】:
-
您的问题更多是关于基本封装而不是 JPA。为了确保数据模型在任何单个时间点的正确性,将操作封装在实体中并返回关联的迭代器/不可修改的集合,以便强制客户端类通过这些方法。客户端代码将永远无法使模型处于不一致的状态,即通过设置关系的一侧而不设置另一侧。
标签: spring jpa spring-data spring-data-jpa