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

标签 spring jpa spring-data-jpa

我对 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/

相关文章:

java - Hive jdbc.query(sql, rowmapper) 抛出 UnCatogarized 异常

java - JPA:检查实体对象是否已持久化

java - 未定义 [javax.persistence.EntityManagerFactory] ​​类型的合格 bean

尽管出现 FileNotFoundException,Java Spring Boot 配置文件仍能正确处理

java - spring cloud端口号,让选择变得智能

spring - Elasticsearch Spring数据-文档注释中的动态indexName

java - src/test/中的 IntelliJ Idea JPA 实体

hibernate - 如何将构造函数映射与 Spring JPA 存储库结合使用

java.lang.IllegalStateException : No thread-bound request found, 方面的异常

java - 无法持久化实体(单向多对一关系)