在我的 Spring 项目中,我分别有域和模型层。域层只是实体,映射到 MySQL 数据库中的表。模型用于服务层。我有两个表:用户和角色,它们具有多对多关系。
@Entity
@Table(name = "user")
public class UserEntity {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToMany(mappedBy="users", cascade=CascadeType.ALL,fetch=FetchType.EAGER)
private List<RoleEntity> roles;
//..Getters Setters
}
@Entity
@Table(name = "role")
public class RoleEntity {
@Id
@GeneratedValue
private Long id;
private String value;
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name = "user_role",
joinColumns = @JoinColumn(name = "role_id") , inverseJoinColumns = @JoinColumn(name = "user_id") )
private List<UserEntity> users;
}
模型
public class User {
private Long id;
private String name;
private List<Role> roles;
}
public class Role {
private Long id;
private String value;
private List<User> users;
}
存储层
@Repository
public interface UserRepo extends JpaRepository<UserEntity, Long>{
}
服务
@Service
public class UserService {
@Autowired
private UserRepo userRepo;
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
MapperFacade mapper = mapperFactory.getMapperFacade();
public void save(User user) {
userRepo.save(mapper.map(user, UserEntity.class));
}
public User getUser(Long id) {
return mapper.map(userRepo.findOne(id), User.class);
}
}
问题是 - 每次我检索用户并更新它的属性(例如名称),然后将其保存回表中,连接表 user_role 中的行也会覆盖。例如,如果它是
id=1,user_id=1,role_id=1
, 比更新后变成
id=2,user_id=1,role_id=1
.
@Test
public void contextLoads() {
User user = userService.getUser(1L);
user.setName("kyk");
userService.save(user);
}
没有映射器它可以正常工作,所以映射器是原因。而且我找不到任何解决方法。有没有人遇到过同样的问题?将感谢任何帮助。