无法添加或更新子行:外键约束失败-休眠中的双向映射

Biz*_*zzy 4 java hibernate jpa java-ee

嗨,我对JPA有问题...

D B:

数据库

Java类(忽略不相关的字段):

用户:

@Entity
public class User{
    @Id
    private int iduser;

    //bi-directional many-to-one association to UserInfo
    @OneToMany(mappedBy="user", cascade= {CascadeType.ALL}, fetch=FetchType.EAGER)
    private List<UserInfo> userInfos;
}
Run Code Online (Sandbox Code Playgroud)

用户信息:

@Entity
@Table(name="user_info")
public class UserInfo {
    @Id
    @Column(name="iduser_info")
    private int iduserInfo;

    //bi-directional many-to-one association to User
    @ManyToOne  
    private User user;
}
Run Code Online (Sandbox Code Playgroud)

目前,当我尝试执行此操作时(再次省略了设置无关字段的设置):

User u = new User();            
UserInfo info = new UserInfo();
u.addUserInfo(info);

em.persist(u); // save user
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Cannot add or update a child row: a foreign key constraint fails (`webstore`.`user_info`, CONSTRAINT `fk_user_info_user` FOREIGN KEY (`user_iduser`) REFERENCES `user` (`iduser`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Run Code Online (Sandbox Code Playgroud)

我整天都在努力工作,我不知道该怎么办...我也在这里搜索解决方案,但它们都表明此错误表明我想输入UserInfo而不输入user_iduser值,但是即使添加这之前坚持:

info.setUser(u);
Run Code Online (Sandbox Code Playgroud)

它仍然不起作用-级联是否支持双向映射?理想的效果是,应先插入User,然后再引用原始User,然后再插入列表中的所有UserInfo。我该如何实现?

我不想做

SET foreign_key_checks = 0/1;
Run Code Online (Sandbox Code Playgroud)

每次=(

Buh*_*ndi 5

尝试:

@ManyToOne
@JoinColumn(name="user_iduser", nullable=false)
private User user;
Run Code Online (Sandbox Code Playgroud)

然后看看这是否有效。我假设在user_info表中,该user_id字段NOT NULL在您的RDBMS中。另外,由于它是双向的,因此您必须setXXX启用UserInfoUser

User u = new User();            
UserInfo info = new UserInfo();
info.setUser(u);
u.addUserInfo(info);

em.persist(u); // save user
Run Code Online (Sandbox Code Playgroud)

更新:确定要同时为User和指定ID UserInfo?似乎未设置ID,因此没有引用链接UserInfoUser

如果ID为AUTO_INCREMENT,则在@Id注释后添加以下内容:

@GeneratedValue(strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)