我对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);
}
答案 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;