gpt4 book ai didi

mysql - Spring Data JPA 通过主/外键、对象保存顺序保存一对一关系

转载 作者:行者123 更新时间:2023-11-29 06:29:40 25 4
gpt4 key购买 nike

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

在 User.java 中:

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

@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private Contact contact;

在 Contact.java 中

@Id
@Column(name="USER_ID")
private Integer userId;

@MapsId
@OneToOne(mappedBy = "contact")
@JoinColumn(name = "USER_ID")
private User user;

我使用 userRepository.saveAndFlush(user) 来保存 USER 对象。因为我在 CONTACT 中使用 USER.ID 作为外键,所以我需要在 CONTACT 之前插入 USER,但是 JPA 是先插入 CONTACT,它将 CONTACT 视为 USER 的成员。所以我在插入 CONTACT 时收到 USER_ID can not be NULL 错误。我应该怎么做才能解决这个插入顺序?还是我应该通过共享主键来避免使用 OneToOne 映射?

谢谢!

最佳答案

I have USER(id) and CONTACT(id, first, last) table. CONTACT.user_id is the foreign key to USER table.

通过发表此声明,我会说这种关系不是具有共享主键的一对一关系。如果是这种情况,我希望表结构如下所示。

USER(id)
CONTACT(id, first, last)

作为使用@OneToOne 的替代方法,您可以考虑使用@SecondaryTable,即跨两个表映射用户实体:这似乎更适合该模型。

http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables

无论如何,不​​管怎样,如果您想使用@OneToOne,那么下面的 API 文档的示例二给出了

an example One-to-one association that assumes both the source and target share the same primary key values.

http://docs.oracle.com/javaee/6/api/javax/persistence/OneToOne.html

在此之后我会说映射应该如下所示:

public class User{

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@OneToOne(mappedBy ="user", cascade =CascadeType.ALL)
private Contact contact;
}

public class Contact{

@Id
private Long id;

@OneToOne
@MapsId
@JoinColumn(name = "user_id")
private User user;
}

关于mysql - Spring Data JPA 通过主/外键、对象保存顺序保存一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28685660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com