我有一个JPA实体 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关联并将其添加到团队中的一组关联人员。
我的问题是:我应该把这个方法放在哪里?在实体中,作为瞬态设定者?在存储库中(可能的话)?或者在单独的服务对象中?还有其他简化程序的方法吗?
答案 0 :(得分:1)
在我的建议中,您应该创建一个存储库层,您可以在其中放置所有“存储库”逻辑。在这一层中,您应该将所有CRUD方法(DAO)和所需的所有其他方法与您的实体和实体之间相关联,如DCS(数据控制服务模式)。
通过这种方式,您可以拥有一个存储库责任类,而无需在服务层中分散数据库逻辑。
这应该被视为建筑样式的建议,这是一个有效的选择,因为在你的代码区只有预先存在逻辑而不是业务逻辑。
如果您的addAdminToTeam方法必须执行更多工作,那么音乐会发生变化,从而影响您的业务逻辑。对于安全日志记录等,您可以依赖Spring AOP,但对于其他承诺,您应该考虑服务层。但是在您的情况下,我认为如上所述的存储库层是最佳解决方案。因为我认为setter选项不是一个好选择,因为你在域对象中创建了一个持久性事物的紧密耦合实现,并且对于过程,你将逻辑分散在你的java代码和数据库中运行的代码中
我希望这可以帮到你