【发布时间】: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