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

时间:2014-08-03 00:27:34

标签: spring jpa spring-data-jpa

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

我想我的关系是正确的。除了一个问题外,一切运作良好。保存到数据库后,Tag值为“Null”。

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

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

任何人都可以解释为什么通过Cascade.persist选项保存时,value列为null?

来自客户类

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

来自Tag Class:

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

}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

实际上,当您调用merge时,SpringData将主要使用save,因此最好将级联设置为PERSIST MERGE

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