這次的case是這樣
舉例來說
EntityClass預設的NameQuery是這樣
@NamedQuery(name = "TABLE_A.findByID", query = "SELECT n FROM TABLE_A n WHERE n.ID = :ID")})
使用Entity Manger來建立
em.createQuery( "SELECT n FROM TABLE_B n WHERE n.ID =:ID" )
這兩個query看起來都一樣,且TABLE_A與TABLE_B的ID都是long型態,可是當參數long給NamedQuery用沒問題,給createQuery卻有error,而且error msg是要求傳入一個Entity Class,這表示遇到了JPA在處理有forign key table的特性。
當EntityClass建立時,會依table內的欄位產生對應的NamedQuery,但是如果該欄位是forign key,那就不會有對應的NamedQuery。
所以在使用Entity Class時,若因找不到可用NameQuery而自己寫一個createQuery,像TABLE_B那樣,但JPA中forign key欄位不能亂傳,會限制要傳入參照Table的Entity Class。
如果沒有對應table的entity class,這代表在建立TABLE_B的entity class時沒有把參照的table也拉進來
(NetBean 7上是可以這樣做的,有參照table時會有紅字提醒)
沒有留言:
張貼留言