更新实体的子引用集(OneToMany)

时间:2016-04-02 20:32:43

标签: hibernate jpa

我有两个实体:

public class Content {

    @Id
    @Column(name = "content_id")
    @SequenceGenerator(name = "identifier", sequenceName = "contents_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "identifier")
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH, orphanRemoval = true)
    @Cascade({
            org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.DELETE,
            org.hibernate.annotations.CascadeType.MERGE,
            org.hibernate.annotations.CascadeType.PERSIST
    })
    @JoinColumn(name = "content_id", nullable = false)
    private Set<Provider> providers;

    public Set<Provider> getProviders() {
        if (providers == null) {
            providers = new HashSet<>();
        }
        return providers;
    }

    protected void setProviders(Set<Provider> providers) {
        this.providers = providers;
    }
}

public class Provider {

    @Id
    @Column(name = "provider_id")
    @SequenceGenerator(name = "identifier", sequenceName = "contents_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "identifier")
    private Long id;

    @Column(name = "content_id", insertable = false, updatable = false)
    private Long contentId;
}

我有两种情况:

  1. 创建新内容 总之,我正在做以下事情:

    内容content = new Content(); 设置providers = new HashSet()&lt;&gt ;; //填充集 content.getProviders()的addAll(提供者);

  2. 然后我使用 io.dropwizard.hibernate.AbstractDAO 的包装器 我正在跑步:

    content = persist(content);
    

    当我找回实体内容时,一切运作良好 我可以看到它包含一组提供商,每个提供商都有一个ID

    1. 在我的第二个场景中,我正在尝试更新现有内容:

      内容content = findById(id); content.getProviders()清除()。 content.getProviders()。add(new Provider()); //我正在添加一个新的提供者 content = persist(content);

    2. 问题是在第二种情况下(更新)我看到现在实体只有新的提供者,但由于某种原因,提供者ID返回为null

      content.getProviders().iterator().next().getId(); // returns null
      

      再过一次,我收到这些内容,我可以看到给新提供商的ID:

      Content content = findById(id);
      content.getProviders().iterator().next().getId(); // returns an id and not null
      

      有人可以帮我理解我做错了什么吗?我在两种情况下使用完全相同的持久性,根据文档应该创建实体是新的还是更新,以防实体已经存在。

      我想请注意,我已经在这里缩短了,当我生成DTO对象并将其作为JSON返回给客户端时,我基本上会看到这种行为。

      提前谢谢。

0 个答案:

没有答案