如果在Hibernate項目里面配了很多many-to-one的關聯,即使后台在查詢數據時已經作了健全性判斷,但還是會經常拋出對象找不到異常:org.hibernate.ObjectNotFoundException: No row with the given identifier exists。
比如系統在用戶的使用過程中,數據庫表的數據會常發生變化,最常見的是人員變化,原先引用的User在數據庫表沒了,而Hibernate做了多對一關聯,多的這端引用的一的那端,一旦引用值在一的那端找不到數據,默認就會拋出異常,而后台判斷卻控制不了此問題。
Hibernate Reference有介紹到,在多對一關系中,即many-to-one標簽元素中有一個屬性not-found,用來指定引用的外鍵不存在時將如何處理。
not-found屬性有兩個候選值:
1.exception(默認)拋出異常。
2.ignore,忽略異常,不拋出異常。
<many-to-one name="project" column="projId" class="com.toone.yanggb.model.Project" not-found="ignore"/>
在不配置這個屬性的情況下,Hibernate會采用默認的拋出異常來處理;當配置了not-found屬性並將值設置為ignore之后,就可以取消關聯外鍵引用數據丟失拋異常的設置。
另外的,Spring/Hibernate還提供有@NotFound注解,效果和not-found屬性相當。
@NotFound(action = NotFoundAction.IGNORE)
@ManyToOne(cascade = {CascadeType.PERSIST}, targetEntity = Topic.class) @JoinColumn(name = "topic_id", updatable = false) @NotFound(action = NotFoundAction.IGNORE) private Topic topic;
"喜歡就像乘法一樣,只要一方為零,結果便為零。"