我有两个实体:
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;
}
我有两种情况:
创建新内容 总之,我正在做以下事情:
内容content = new Content(); 设置providers = new HashSet()&lt;&gt ;; //填充集 content.getProviders()的addAll(提供者);
然后我使用 io.dropwizard.hibernate.AbstractDAO 的包装器 我正在跑步:
content = persist(content);
当我找回实体内容时,一切运作良好 我可以看到它包含一组提供商,每个提供商都有一个ID
在我的第二个场景中,我正在尝试更新现有内容:
内容content = findById(id); content.getProviders()清除()。 content.getProviders()。add(new Provider()); //我正在添加一个新的提供者 content = persist(content);
问题是在第二种情况下(更新)我看到现在实体只有新的提供者,但由于某种原因,提供者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返回给客户端时,我基本上会看到这种行为。
提前谢谢。