休眠user_roles表在使用多对一关系时不会更新



>我有 3 个表,用户、角色和User_role。用户具有由"用户"映射的 OneToMany 关系与 CascadeType。合并,user_role 与 CascadeType 具有 2 个 ManyToOne 关系。但是,user_table在运行休眠时从不填充数据。相反,值仅填充在用户和角色表中,而不填充user_role表中。

用户表定义

@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<>();

用户角色表:

@Entity
@Table(name="user_role")
public class UserRole implements Serializable {
private static final long serialVersionUID = 890345L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long userRoleId;
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL, 
optional=false)
@JoinColumn(name = "user_id")
private User user;
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL,  
optional=false)
@JoinColumn(name = "role_id")
private Role role;
public UserRole () {}
public UserRole (User user, Role role) {
this.user = user;
this.role = role;
}
public long getUserRoleId() {
return userRoleId;
}
public void setUserRoleId(long userRoleId) {
this.userRoleId = userRoleId;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}

在 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;    
}

}

主类运行((

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);
}

CascadeType.MERGE只会级联合并事件。持久化事件不会级联,因此,如果您尝试保存新用户,持久化事件不会级联到User_role,并且不会将任何条目插入到user_role表中。

尝试添加 CascadeType.PERSIST 或更改为 CascadeType.ALL 以便级联保存数据库中的记录。

@OneToMany(mappedBy = "user", cascade={CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER)

您可以在此答案中找到有关级联事件的更多信息:REFRESH 和 MERGE 在数据库方面意味着什么?

我能够通过实现 JPA 实体管理器将数据持久保存到user_role关联表中。一个新的 EntityManager 类被实例化,数据通过 javax.persistence .merge(( 方法持久化。

最新更新