当前位置: 首页 > 知识库问答 >
问题:

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

吴伟志
2023-03-14

我对Spring和JPA等比较陌生。我试图在标签和客户之间建立一种多对多的关系(双向)

我想我的关系是对的。除了一个问题外,一切都很好。标记值保存到数据库后为“Null”。

因此,我要做的是——向客户添加一个新的标签列表,然后在保存客户时使用级联选项来保存它。在调用CustomerRepository之前,我设置了一个调试点。保存(customer),标记都有值。在保存操作(在客户存储库上)后,我观察到两件事-针对客户的标记仍然与id无关,但在数据库中创建了标记,但值没有存储在列中。因此,如果我针对客户设置了4个标记,那么关系表和标记表中都会有4个新行,但是这些值将为null,即使它们是针对标记对象正确设置的。

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

有人能解释为什么值列将通过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);

}

共有2个答案

戚飞雨
2023-03-14

我认为问题是您使用的是hibernate专用方法保存()而不是持久()。我建议您删除@Cascade(用于hibernate会话对象,而不是实体管理器)并使用@ManyTo众多(cascade=CascadeType. PERSIST),它应该按照您想要的方式工作。

骆昊阳
2023-03-14

事实上,当您调用保存时,SpringData将主要使用合并,因此您最好将级联设置为PERSISTMERGE

java prettyprint-override">    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="address")
    private Address address;
 类似资料:
  • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗

  • 我使用的是Spring数据jpa。将子实体添加到父实体后,我将父实体保存到数据库。我想得到孩子的身份证,但我发现我得到的是空的。 我在getId()方法中添加了@GeneratedValue(Strategy=GenerationType.IDENTITY),但它不起作用。 以下是模型: 父实体已经在数据库中,所以我直接找到它,父存储库entends Jpa列举 这里是我的测试代码: 我得到的输出

  • 我想删除所有具有某些lineId的记录,以保存另一个具有相同lineId的记录(作为刷新),但删除后我无法保存任何内容。没有任何错误,但数据库中没有我的记录。 当我没有删除代码时,一切都会正确保存。

  • 在使用hibernate和jpa的spring mvc项目中,我有一个实体和一个实体。每个可以有许多,但每个只能有一个。如何为现有的保存新的? 我读过很多关于这个的帖子。如果我试图保存新的,就会出现无法保存分离实体的错误。但如果我试图保存现有的,则不会保存该角色。我读了这篇帖子,建议将hibernate注释移动到getter,但当我这样做时,我会收到一个引用未知属性的hibernate映射错误。这

  • 一些背景知识,我在我的web应用程序中使用JPA/Hibernate/Spring,我也使用org。springframework。orm。jpa。支持OpenEntityManagerViewFilter和用于处理实体的扩展持久性上下文。 问题: > 使用find方法从数据库加载实体,实体存储在会话中 用户更改实体并点击保存 用户更改反映在会话中存储的实体上(在控制器中) 实体被发送到服务类中的

  • 代码: 三个问题: > 我必须放置<code>CascadeType吗。在两个实体中删除?我希望它能正常工作,这样如果我删除了老师,课程就会自动删除。 在我的数据库中,我的id无法正常工作。我希望它使id每次增加一个,但它目前增加了一些随机数。为什么呢? 我还有两个类,但有关系。当我想在数据库中持久化一个新对象时,我必须做什么?