【问题标题】:Hibernate JPA : ignore wrong sql foreign key valuesHibernate JPA:忽略错误的 sql 外键值
【发布时间】:2015-10-29 20:32:09
【问题描述】:

我有一个项目要维护,这个项目的持久层使用JPAHibernate,它运行在MySQL服务器上,数据库不是relational,引擎是MyISAM on所有表格。

我的实体上有一些外键关系映射为@ManyToOne 关系。

现在的问题是,其中一些列应该是 foreignkeys 以便正确映射,但它们不是(因为引擎是 MyISAM,而 DB 只是 relational理论上),其中一些列的值是错误的,例如 (负数 -1 , 0 ,不存在的死去的父母)

@Entity
public class EntityA {

   @ManyToOne
   @JoinColumn(name="COL_FK")
   private EntityB b;

}

在数据库中,COL_FK 的可能值为:0,-1,DEAD PARENTS

我既不能更改数据库结构也不能编辑 列中的数据。我所能做的就是更改代码。

我如何告诉 Hibernate 在获取列表时忽略这些值而不抛出 RuntimeException,因为其中一个元素包含错误的 foreingkey 值。

谢谢。

更新:

@Embeddable
public class EntityA {
    @ManyToOne()
    @JoinColumn(name = "idClient")
    @NotFound(action = NotFoundAction.IGNORE)
    private ClientBO idClient;

}

堆栈跟踪:

AVERTISSEMENT: org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find xx.xxx.xx.xxx.ClientBO with id 210; nested exception is javax.persistence.EntityNotFoundException: Unable to find xx.xx.xx.xxx.ClientBO with id 210

【问题讨论】:

  • 在抛出 RuntimeException 的地方添加一个 try catch 但这对我来说听起来很奇怪,因为此后任何时候如果引用了外来对象,您很可能会遇到 NullPointerException
  • @j.con 这不是一个选项,这不是 oneElement 的问题,而是整个表格的问题,例如,当您尝试获取元素列表时,您将得到异常并且由于无法映射一个元素,因此无法加载整个列表。
  • 你在抓取表格数据时使用javax.persistence.criteria.CriteriaQuery吗?
  • @j.con 我使用Spring-data-jpaquerydsl 有时Specification

标签: java hibernate jpa spring-data myisam


【解决方案1】:

注释您的关联

@NotFound(action=NotFoundAction.IGNORE)

请注意,这是对已经很丑陋的解决方案的又一破解。 Hibernate 严重依赖事务(应该如此),而 MyISAM、AFAIK 不支持事务。我想你已经知道了,但是修复数据库会是一个更好的选择。

【讨论】:

  • 是的,我知道,问题是解决方案已经很难看,我有Permission Denied 来更改它。我所能做的就是尝试修复代码。尽管我不断收到javax.persistence.EntityNotFoundException,但黑客并没有奏效
  • 应该可以。您应该编辑您的问题,发布更新后的实体代码、重现问题的最小测试用例的代码以及异常的堆栈跟踪。
  • 谢谢,它有效。我不知道为什么我第一次测试它时会出现奇怪的行为并且它不起作用。
【解决方案2】:

ALTER TABLE ... ENGINE=InnoDB。

MyISAM 接受FOREIGN KEYs 的语法,但不实现它们。它还会忽略与事务相关的任何命令(如COMMIT)。

MyISAM 确实处理“关系”。它处理INDEXesJOINs。它只是没有做FOREIGN KEYs 提供的额外东西。

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2016-08-31
    • 1970-01-01
    • 2013-01-25
    • 2015-06-18
    • 2011-06-05
    相关资源
    最近更新 更多