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