gpt4 book ai didi

spring - 在 spring jpa 实体中保存级联实体后缺失值

转载 作者:行者123 更新时间:2023-12-05 06:45:18 25 4
gpt4 key购买 nike

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

我想我的关系是对的。除了一个问题外,一切都很好。 Tag存入数据库后值为“Null”。

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

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

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

来自客户类

@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);

}

最佳答案

事实上,当你调用save时,SpringData主要会使用merge,所以你最好将cascade设置为PERSIST 并且 合并

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

关于spring - 在 spring jpa 实体中保存级联实体后缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com