Java 使用多通关系时,Hibernate user_roles表不会更新
我有3个表,用户、角色和用户角色。用户有一个由“用户”映射的带有级联类型的OneToMany关系。合并和用户\u角色有两个带有级联类型的多通关系。但是,在运行hibernate时,用户\u表从不填充数据。相反,值仅填充在用户和角色表中,而从不填充在用户和角色表中 用户表定义Java 使用多通关系时,Hibernate user_roles表不会更新,java,spring,hibernate,jpa,orm,Java,Spring,Hibernate,Jpa,Orm,我有3个表,用户、角色和用户角色。用户有一个由“用户”映射的带有级联类型的OneToMany关系。合并和用户\u角色有两个带有级联类型的多通关系。但是,在运行hibernate时,用户\u表从不填充数据。相反,值仅填充在用户和角色表中,而从不填充在用户和角色表中 用户表定义 @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="Id", nullable=false, updatable = false) privat
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="Id", nullable=false, updatable = false)
private Long id;
private String username;
private String password;
private String firstName;
private String lastName;
private String email;
private String phone;
private boolean enabled = true;
@OneToMany(mappedBy = "user", cascade=CascadeType.MERGE, fetch =
FetchType.EAGER)
@JsonIgnore
private Set<UserRole> userRoles = new HashSet<>();
调用从命令行运行程序调用的userServiceImpl中的userRepository.save()
@Service
公共类UserServiceImpl实现UserService{
private static final Logger LOG = LoggerFactory.getLogger(UserSecurityService.class);
@Autowired
private UserRepository userRepository;
@Autowired
private RoleRepository roleRepository;
// Indicates a Database Transaction
@Transactional
public User createUser(User user, Set<UserRole> userRoles) {
User localUser = userRepository.findByUsername(user.getUsername());
if(localUser != null) {
LOG.info("User with username {} already exist. Nothing will be done. ", user.getUsername());
} else {
for (UserRole ur : userRoles) {
roleRepository.save(ur.getRole());
}
Set<UserRole> currentRoles =user.getUserRoles();
currentRoles.addAll(userRoles);
user.setUserRoles(currentRoles);
localUser = userRepository.save(user);
}
return localUser;
}
private static final Logger LOG=LoggerFactory.getLogger(UserSecurityService.class);
@自动连线
私有用户存储库用户存储库;
@自动连线
私人角色扮演者角色扮演者;
//指示数据库事务
@交易的
公共用户createUser(用户用户,设置用户角色){
User localUser=userRepository.findByUsername(User.getUsername());
if(localUser!=null){
LOG.info(“用户名为{}的用户已存在。将不执行任何操作。”,User.getUsername());
}否则{
for(UserRole-ur:userRoles){
roleRepository.save(ur.getRole());
}
设置currentRoles=user.getUserRoles();
currentRoles.addAll(用户角色);
user.setUserRoles(currentRoles);
localUser=userRepository.save(用户);
}
返回本地用户;
}
}
主类运行()
public void运行(字符串…args)引发异常{
用户user1=新用户();
user1.setFirstName(“约翰”);
user1.setLastName(“Adams”);
user1.setUsername(“j”);
user1.setPassword(SecurityUtility.passwordEncoder().encode(“p”));
user1.setEmail(“JAdams@gmail.com");
Set userRoles=new HashSet();
Role role1=新角色();
角色1.setRoleId(1);
角色1.setName(“角色用户”);
添加(新的UserRole(user1,role1));
createUser(user1,userRoles);
}
CascadeType.MERGE将仅级联合并事件。持久化事件不会层叠,因此如果尝试保存新用户,持久化事件将不会层叠到用户角色,并且不会在用户角色表中插入任何条目
尝试添加CascadeType.PERSIST或更改为CascadeType.ALL,以便将记录级联保存到数据库中
@OneToMany(mappedBy = "user", cascade={CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)
您可以在下面的答案中找到有关级联事件的更多信息:通过实现JPA实体管理器,我能够将数据持久化到用户角色关联表中。实例化了一个新的EntityManager类,并通过javax.persistence.merge()持久化数据方法。我们真的需要3个用户角色表吗?是的,用户角色表是一个关联表,用于处理用户和角色共享的多个关系。添加此级联类型时,hibernate现在失败,错误为:javax.persistence.EntityExistsException:已与具有相同标识符值的其他对象关联在UserServiceImpl类中调用save()后立即发生此故障的会话:localUser=userRepository.save(user);
public void run(String... args) throws Exception {
User user1 = new User();
user1.setFirstName("John");
user1.setLastName("Adams");
user1.setUsername("j");
user1.setPassword(SecurityUtility.passwordEncoder().encode("p"));
user1.setEmail("JAdams@gmail.com");
Set<UserRole> userRoles = new HashSet<>();
Role role1 = new Role();
role1.setRoleId(1);
role1.setName("ROLE_USER");
userRoles.add(new UserRole(user1, role1));
userService.createUser(user1, userRoles);
}
@OneToMany(mappedBy = "user", cascade={CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)