【问题标题】:Persisting data to database leads to illegal state exception将数据持久化到数据库导致非法状态异常
【发布时间】:2012-12-03 22:36:07
【问题描述】:

我有一个 JPA 问题。

假设我有一个如下设置的实体(只是一个假设)。

@Entity
@Table (name = "TESTTABLE")
public class TestTable {

@Id
@Basic (optional = false)
private String id;

@JoinColumn(name="TESTID", referencedColumnName = "ID")
@OneToOne(optional = true)
private TestTable testId;

}

基本上,
--=---=---=---=----
|测试表....... |
--=---=---=---=----
|字符串 id..........| |字符串 testId....|------------TestId = id |
--=--=--=--=--=-=

我在数据库中设置了 foreign_key 约束,并且在代码方面,如果为 testId 输入的值在 TestTable 中没有相应的 id 值,我期望返回正常的“违反完整性约束 - 找不到父键”约束(所以如果我仅有的条目是 (1, null) 和 (2, 1), (3, 17) 将导致失败)。

但是,当我尝试将诸如上述 (3, 17) 的条目持久保存到数据库时,我收到 IllegalStateException 错误(因为我没有 CascadeType.PERSIST 并且我试图持久保存一个不存在的对象在分贝中)。我知道这是预期的行为,但是有没有绕过这个并让数据库处理它(从而返回预期的约束)?

谢谢。

【问题讨论】:

  • 你能发布你是如何坚持的吗(3、17)?因为要做到这一点,您需要首先获取 ID 为 17 的 TestTable 实体,然后将其设置为 ID 为 3 的新实体。

标签: jpa jpa-2.0


【解决方案1】:

只需在关系中使用级联 PERSIST。

在 EclipseLink 中你也可以使用持久化单元属性,

"eclipselink.persistence-context.commit-without-persist-rules"="true"

【讨论】:

  • cascade.PERSIST 将不存在的实体添加到表中(所以现在有 (3,17) 和 (17, null))。我不希望这种情况发生。不幸的是,我认为修改 eclipseLink 设置也是不可能的。
  • 所以,它是一个新对象,但你不想持久化它?它从哪里来的?您可以使用 getReference() 使用 Id 获取对现有对象的引用,如果该对象实际上不存在,则会导致您想要的约束错误。
  • 本质上是一个错误案例。要么是有人在 (17, 1) 存在之前“跳枪”并提供 (3, 17),要么在他们的意思是 (3, 1) 时“打错” (3, 17)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多