我有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)
我做错了什么?谢谢!
答案 0 :(得分:0)
问题可能是您的ID生成策略(假设您正确初始化了联系人)。 必须将用户对象插入到DB以设置其ID,但同时Contact需要此id为有效对象。 它们都必须在同一笔交易中发生。
如果您将JPA的日志记录级别切换为罚款(在perstitance.xml中),您很可能会看到插入用户和联系人的顺序,但联系人将使用user_id 0。
因此,a)确保在联系人中明确设置用户(正如您所说,关系由联系人管理.b)在用户上设置联系人。 c)坚持(在一次交易中)。 根据您的JPA实现,它可能仍然不起作用(检查发出的查询,很可能会在联系人上插入然后更新)。将生成策略更改为TABLE,使用TABLE JPA获取下一个空闲ID,将其分配给对象并执行插入操作以使其成为"已知"在插入之前。