Hibernate JPA:忽略错误的sql外键值

时间:2015-08-06 15:39:17

标签: java hibernate jpa spring-data myisam

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

我有一些foreignkey relationshps在我的实体上映射为@ManyToOne关系。

现在问题是其中一些列应该是foreignkeys才能正确映射,但它们不是(因为引擎是MyISAM,而DB 1}}理论上只有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;

}

StackTrace:

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

2 个答案:

答案 0 :(得分:4)

使用

注释您的关联
@NotFound(action=NotFoundAction.IGNORE)

请注意,这是一个已经丑陋的解决方案之上的另一个黑客攻击。 Hibernate严重依赖事务(因为它应该),而MyISAM,AFAIK不支持事务。我想你已经知道了,但修复数据库将是一个更好的选择。

答案 1 :(得分:0)

ALTER TABLE ... ENGINE = InnoDB。

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

MyISAM 处理"关系"。它处理INDEXesJOINs。它只是没有FOREIGN KEYs提供的额外内容。