Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多通关系时,Hibernate user_roles表不会更新_Java_Spring_Hibernate_Jpa_Orm - Fatal编程技术网

Java 使用多通关系时,Hibernate user_roles表不会更新

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

我有3个表,用户、角色和用户角色。用户有一个由“用户”映射的带有级联类型的OneToMany关系。合并和用户\u角色有两个带有级联类型的多通关系。但是,在运行hibernate时,用户\u表从不填充数据。相反,值仅填充在用户和角色表中,而从不填充在用户和角色表中

用户表定义

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