【问题标题】:spring jpa - a different object with the same identifier value was already associated with the sessionspring jpa - 具有相同标识符值的不同对象已与会话相关联
【发布时间】:2016-08-09 14:17:38
【问题描述】:

通过 SO 搜索,但似乎没有与我类似的案例。

有一个实体Country,只有一个字段:

public class Country {

    @Id
    @Column(name = "COUNTRY_CODE")
    private String countryCode;

    public boolean equals(Object o) {}

    public int hashCode() { }
}

还有一个包含这些条目的类:

public class Product {

    @ManyToOne(fetch = EAGER, cascade = ALL)
    @JoinColumn(name = "COUNTRY_CODE")
    private Country country;
}

通过以下方式设置国家/地区时:

product.setCountry(new Country("lv"))

我假设它会被保存,如果它存在的话。

但是我得到了一个异常 - 一个具有相同标识符值的不同对象已经与会话相关联

【问题讨论】:

  • 你能显示堆栈跟踪吗?

标签: java spring jpa


【解决方案1】:

通过查看您提供的尽可能多的代码,出现此类问题是因为对象未引用相同的 Java 对象实例。当您使用相同的会话对象进行读写或放置相同的对象时,可能会发生这种情况在单个会话中。它们指的是数据库中的同一行(即相同的主键),但它们是它的不同副本。所以正在发生的事情是管理实体的会话将跟踪哪个 Java 对象对应具有相同主键的行。

我建议你尝试下面给出的代码。

1- Just set cascade to MERGE, that should work for you.

       OR

2- @GeneratedValue(strategy = GenerationType.SEQUENCE)   OR Other GenerationType 

【讨论】:

  • 这有效 - @ManyToOne(cascade = {PERSIST, MERGE})
  • 这对我有用,但我不明白。我将 @OneToMany(...cascade = CascadeType.ALL...) 更改为 ... CascadeType.MERGE。我认为我的问题出在我的控制器类或其他地方,在那里我运行了 blockRepository.save(new_block)。当我只是在几行之前实例化它并检查了所有内容两次并且它的 PK 是一个时间戳,保证是唯一的时,怎么会有多个副本?但是你的解决方案奏效了。我必须了解原因
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2014-04-16
  • 2013-08-30
相关资源
最近更新 更多