Hibernate 中的关系映射 Java - 保存拥有方实体
Relationship mapping in Hibernate Java - save owning side entity
我有2张桌子
- 用户
- Url
我正在尝试在上述 2 个表之间建立关系。一个用户可以有多个url,但是一个url只能属于一个用户。
我觉得这像是一对多关系。
我的用户实体如下(删除了一些代码以免太长):
public class User{
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private final List<RssUrl> rssUrls = new ArrayList<>();
public void addRssUrl(RssUrl rssUrl) {
rssUrls.add(rssUrl);
rssUrl.setUser(this);
}
public void removeComment(RssUrl rssUrl) {
rssUrls.remove(rssUrl);
rssUrl.setUser(null);
}
我的Url实体如下(删除了一些代码以免太长):
public class RssUrl {
@ManyToOne(fetch = FetchType.LAZY)
private User user;
我一直在遵循我找到的一个相对简单的指南 here。
现在我的问题是:如何保存拥有方实体?
假设我已经创建了一个用户。
User user = getCurrentUserDetails();
我为那个用户添加了一个新的url
user.addRssUrl(rssUrl);
然后呢?
我试过了
User user = getCurrentUserDetails();
user.addRssUrl(rssUrl);
rssUrlRepository.save(rssUrl);
但这会导致错误:
org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
当然,我可能做错了,也许我的关系一开始就不正确?
我对想法很开放。
您正确配置了User
和Url
之间的关系。它主要是在保存 Url
时抱怨,它的 User
是一条新记录。
如果您先保存 User
,问题可以解决:
User user = getCurrentUserDetails();
user.addRssUrl(rssUrl);
userRepository.save(user);
rssUrlRepository.save(rssUrl);
但是由于您已经配置 cascade
is ALL for User
的 Url
,所有应用于 User
的 JPA 操作将自动应用于其 Url
也是,这意味着您可以简单地做:
User user = getCurrentUserDetails();
user.addRssUrl(rssUrl);
userRepository.save(user);
我有2张桌子
- 用户
- Url
我正在尝试在上述 2 个表之间建立关系。一个用户可以有多个url,但是一个url只能属于一个用户。
我觉得这像是一对多关系。
我的用户实体如下(删除了一些代码以免太长):
public class User{
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private final List<RssUrl> rssUrls = new ArrayList<>();
public void addRssUrl(RssUrl rssUrl) {
rssUrls.add(rssUrl);
rssUrl.setUser(this);
}
public void removeComment(RssUrl rssUrl) {
rssUrls.remove(rssUrl);
rssUrl.setUser(null);
}
我的Url实体如下(删除了一些代码以免太长):
public class RssUrl {
@ManyToOne(fetch = FetchType.LAZY)
private User user;
我一直在遵循我找到的一个相对简单的指南 here。
现在我的问题是:如何保存拥有方实体?
假设我已经创建了一个用户。
User user = getCurrentUserDetails();
我为那个用户添加了一个新的url
user.addRssUrl(rssUrl);
然后呢?
我试过了
User user = getCurrentUserDetails();
user.addRssUrl(rssUrl);
rssUrlRepository.save(rssUrl);
但这会导致错误:
org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
当然,我可能做错了,也许我的关系一开始就不正确?
我对想法很开放。
您正确配置了User
和Url
之间的关系。它主要是在保存 Url
时抱怨,它的 User
是一条新记录。
如果您先保存 User
,问题可以解决:
User user = getCurrentUserDetails();
user.addRssUrl(rssUrl);
userRepository.save(user);
rssUrlRepository.save(rssUrl);
但是由于您已经配置 cascade
is ALL for User
的 Url
,所有应用于 User
的 JPA 操作将自动应用于其 Url
也是,这意味着您可以简单地做:
User user = getCurrentUserDetails();
user.addRssUrl(rssUrl);
userRepository.save(user);