【发布时间】:2019-06-13 09:54:48
【问题描述】:
如果我使用这段代码(图片中的CASE 1):
@Data
@Entity
public class PostOneUni {
@EmbeddedId //if @Id, class CompositeId must be annotated @Embeddable?
private CompositeId id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumns({
@JoinColumn(name = "id1"),
@JoinColumn(name = "id2")
})
private Set<PostCommentUniMany> comments = new HashSet<>();
...
}
当执行创建此对象并添加子 cmets 时,当保存到 DB 时,一切都按预期工作(子 PostCommentUniMany 上的 ID 按预期添加)但更改不会传播到 java 代码(图片中的对象 @12081应该将 id 字段更新为 2 而不是 null)。
在其他情况下(CASE 2)我使用这个代码:
@Data
@Entity
public class PostOneUni {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private Set<PostCommentUniMany> comments = new HashSet<>();
...
}
从图中可以看出,fields也被持久化到了DB中,保存后用来保存状态到DB的对象更新(对象@12052更新反映id字段为@ 987654332@ - 在 DB 中)。
如何更新 CASE 1 中的对象 @12081 以反映 DB id?
更新
经过下面的讨论 - 问题是如果实体上的 id 手动设置为某个值,Spring 认为它不是新实体并尝试进行合并而不是持久化实体。
“解决方法”之一是在@Entity 类PostOneUni 上设置@Version 字段,该字段将跟踪实体是否是新的。
@Version
private Integer version;
【问题讨论】:
-
您需要发布 ID 类的代码以及用于创建和持久化这些对象的代码。
-
@Alan Hay - 我可以。 Composite 只是标准的 lombok @_Value 并使用 Spring Data JPA repos .save(PostOneUni) 方法使用 @_Transactional 完成保存。
-
你需要添加代码不要告诉我。
-
@AlanHay 好的,我更新了代码。
-
集合中的实例
comment2和实例comment2是内存中的不同项,显然不好。我希望这些在内存中是相同的实例。这是怎么发生的?
标签: java hibernate jpa orm nhibernate-mapping