【问题标题】:missing value after saving cascading entity in spring jpa entity在spring jpa实体中保存级联实体后缺少值
【发布时间】:2014-09-25 20:33:12
【问题描述】:

我对 Spring 和 JPA 等比较陌生。我正在尝试在标签和客户之间创建多对多关系(双向)

我认为我的关系是正确的。这一切都很好,除了一个问题。保存到数据库后,Tag 值为“Null”。

所以我正在做的是 - 向客户添加一个新的标签列表,然后在保存客户时使用 Cascade 选项将其持久化。我在调用 CustomerRepository.save(customer) 之前设置了一个调试点,并且标签都有值。 在保存操作(在客户存储库上)之后,我观察到两件事 - 针对客户的标签仍然没有与 id 关联,但是在数据库中创建了标签,但值没有存储在列中。因此,如果我为客户设置了 4 个标签,则关系表和标签表中都会有 4 个新行,但即使它们针对 Tag 对象正确设置,这些值也会为空。

另外,如果我在尝试通过级联保存之前直接对标签存储库调用 save,它会保存值并且一切正常(除了它的事务性方面)...

谁能解释为什么通过 Cascade.persist 选项保存时 value 列会为空?

来自客户类

@ManyToMany
    @JoinTable(
            name="customer_tags",
            joinColumns={@JoinColumn(name="customerId", referencedColumnName="id")},
            inverseJoinColumns={@JoinColumn(name="tagId", referencedColumnName="id")})
    @Cascade(value = CascadeType.PERSIST)
    private List<Tag> tags = new LinkedList<Tag>();

来自标记类:

@ManyToMany(mappedBy = "tags")
private List<Customer> customers;

我的仓库是这样的:

/**
 * The tag interface is used to retrieve, save and manage customer tags.
 */
public interface TagRepository extends JpaRepository<Tag, Long> {
    /**
     * Finds a list of tags
     * @return
     */
    public List<Tag> findByTag(String tag);

}

【问题讨论】:

  • 您需要将客户添加到标签中。我建议你在客户实体的 getTag() 方法中这样做
  • 我尝试将客户添加到另一端。它没有任何效果,该列仍然被保存为空。
  • 能把保存方法也发一下吗

标签: spring jpa spring-data-jpa


【解决方案1】:

我认为问题在于您使用的是休眠专用方法save() 而不是persist()。我建议你删除@Cascade(这是用于休眠会话对象,而不是用于实体管理器)并使用@ManyToMany(cascade = CascadeType.PERSIST),它应该可以按你的意愿工作。

【讨论】:

  • 我把注解改成了JPA,没有任何效果。 save 方法来自 Spring JPA 模板,并且调用在幕后持续存在。
  • 尝试将cascadeType改为CascadeType.ALL
  • 更改为 CascadeType.ALL 似乎有效。我不确定为什么会有所不同。我会将其标记为正确,但如果您可以发表评论说明为什么会很棒...
【解决方案2】:

事实上,当你调用save时,SpringData将主要使用merge,所以你最好将级联设置为PERSISTMERGE

    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="address")
    private Address address;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多