Hibernate JPA:忽略错误的 sql 外键值
Hibernate JPA : ignore wrong sql foreign key values
我有一个项目要维护,这个项目的持久层使用JPA
和Hibernate
并且在MySQL
服务器上是运行,数据库是不是 relational
并且引擎在所有表上都是 MyISAM
。
我有一些外键关系在我的实体上映射为 @ManyToOne
关系。
现在的问题是,为了正确映射,其中一些列应该是 foreignkeys
,但它们不是(因为引擎是 MyISAM
,并且 DB
理论上只是 relational
),其中一些列有错误的值,例如 (负数 -1 , 0 ,不存在的死 parents).
@Entity
public class EntityA {
@ManyToOne
@JoinColumn(name="COL_FK")
private EntityB b;
}
在数据库中,COL_FK
的可能值为:0,-1,DEAD PARENTS
我既不能更改数据库结构也不能编辑
columns.All里面的数据我能做的就是改代码。
我怎样才能告诉 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
注释您与
的关联
@NotFound(action=NotFoundAction.IGNORE)
请注意,这是在一个已经很丑陋的解决方案之上的又一个 hack。 Hibernate 严重依赖事务(它应该如此)而 MyISAM,AFAIK,不支持事务。我猜你已经知道了,但修复数据库会是一个更好的选择。
改变TABLE ...引擎=InnoDB。
MyISAM 接受 FOREIGN KEYs
的语法,但不实现它们。它还会忽略与交易相关的任何命令(如 COMMIT
)。
MyISAM 处理 "relations"。它处理 INDEXes
和 JOINs
。它只是不执行 FOREIGN KEYs
提供的额外内容。
我有一个项目要维护,这个项目的持久层使用JPA
和Hibernate
并且在MySQL
服务器上是运行,数据库是不是 relational
并且引擎在所有表上都是 MyISAM
。
我有一些外键关系在我的实体上映射为 @ManyToOne
关系。
现在的问题是,为了正确映射,其中一些列应该是 foreignkeys
,但它们不是(因为引擎是 MyISAM
,并且 DB
理论上只是 relational
),其中一些列有错误的值,例如 (负数 -1 , 0 ,不存在的死 parents).
@Entity
public class EntityA {
@ManyToOne
@JoinColumn(name="COL_FK")
private EntityB b;
}
在数据库中,COL_FK
的可能值为:0,-1,DEAD PARENTS
我既不能更改数据库结构也不能编辑 columns.All里面的数据我能做的就是改代码。
我怎样才能告诉 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
注释您与
的关联@NotFound(action=NotFoundAction.IGNORE)
请注意,这是在一个已经很丑陋的解决方案之上的又一个 hack。 Hibernate 严重依赖事务(它应该如此)而 MyISAM,AFAIK,不支持事务。我猜你已经知道了,但修复数据库会是一个更好的选择。
改变TABLE ...引擎=InnoDB。
MyISAM 接受 FOREIGN KEYs
的语法,但不实现它们。它还会忽略与交易相关的任何命令(如 COMMIT
)。
MyISAM 处理 "relations"。它处理 INDEXes
和 JOINs
。它只是不执行 FOREIGN KEYs
提供的额外内容。