Hibernate 中的关系映射 Java - 保存拥有方实体

Relationship mapping in Hibernate Java - save owning side entity

我有2张桌子

我正在尝试在上述 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

当然,我可能做错了,也许我的关系一开始就不正确?

我对想法很开放。

您正确配置了UserUrl之间的关系。它主要是在保存 Url 时抱怨,它的 User 是一条新记录。

如果您先保存 User,问题可以解决:

 User user = getCurrentUserDetails();
 user.addRssUrl(rssUrl);

 userRepository.save(user);
 rssUrlRepository.save(rssUrl);

但是由于您已经配置 cascade is ALL for UserUrl ,所有应用于 User 的 JPA 操作将自动应用于其 Url 也是,这意味着您可以简单地做:

 User user = getCurrentUserDetails();
 user.addRssUrl(rssUrl);

 userRepository.save(user);