我有一个要维护的项目,此项目的持久层使用JPA
和Hibernate
,它在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
答案 0 :(得分:4)
使用
注释您的关联@NotFound(action=NotFoundAction.IGNORE)
请注意,这是一个已经丑陋的解决方案之上的另一个黑客攻击。 Hibernate严重依赖事务(因为它应该),而MyISAM,AFAIK不支持事务。我想你已经知道了,但修复数据库将是一个更好的选择。
答案 1 :(得分:0)
ALTER TABLE ... ENGINE = InnoDB。
MyISAM接受FOREIGN KEYs
的语法,但不实现它们。它还会忽略与事务相关的任何命令(如COMMIT
)。
MyISAM 处理"关系"。它处理INDEXes
和JOINs
。它只是没有FOREIGN KEYs
提供的额外内容。