Spring Data JPA保存一对一关系获取无法添加或更新子行:外键约束失败

时间:2015-02-23 21:05:37

标签: java mysql hibernate jpa spring-data-jpa

我有USER(id)和CONTACT(user_id,first,last)表。 CONTACT.user_id是USER表的外键。

在User.java中:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

//bi-directional one-to-one association to Contact
@OneToOne(mappedBy="user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)   
private Contact contact; 

在Contact.java中:

    @Id
//  @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private int userId;

//bi-directional one-to-one association to User
@OneToOne(cascade = CascadeType.ALL )
@PrimaryKeyJoinColumn(name = "User_id")
private User user;

当我运行userRepository.save(用户)时,我得到:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`mysite`.`contact`, CONSTRAINT `fk_CONTACT_USER1` FOREIGN KEY (`USER_ID`) REFERENCES `user` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION)  

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

问题可能是您的ID生成策略(假设您正确初始化了联系人)。 必须将用户对象插入到DB以设置其ID,但同时Contact需要此id为有效对象。 它们都必须在同一笔交易中发生。

如果您将JPA的日志记录级别切换为罚款(在perstitance.xml中),您很可能会看到插入用户和联系人的顺序,但联系人将使用user_id 0。

因此,a)确保在联系人中明确设置用户(正如您所说,关系由联系人管理.b)在用户上设置联系人。 c)坚持(在一次交易中)。 根据您的JPA实现,它可能仍然不起作用(检查发出的查询,很可能会在联系人上插入然后更新)。将生成策略更改为TABLE,使用TABLE JPA获取下一个空闲ID,将其分配给对象并执行插入操作以使其成为"已知"在插入之前。