看板 java 關於我們 聯絡資訊
spring data jpa 問題 大家好,在開發程式時遇到一個問題... 說實在的這問題我認為非常奇妙... 我在實作時有用到 java reflection,今天在 debug發現一個奇妙現象... 其中我有一個 API 是這樣使用 EntityUtil.getIdValue(Object entity) 這方法會取得到傳入 entity 的 id 值 此方法是檢查 class 的 annotation 來取值 今天有一個頁面出現錯誤 經過檢查,是查不到entity annotation, 我是透過此方式呼叫的 for(Object o : catalogDao.findAll()) { try { map.put(EntityUtil.getIdValue(o), "defaultValue"); } catch(Exception e) { log.info("no id value:" + o); } } 透過 eclipse 檢查發現很神奇的現象 http://i.imgur.com/3EOYiGo.png 我的 class 名稱被改掉了... 名稱後面被加上 _$$_jv... 另外可看到 "catalogName" 及 "pid" 都是 null 但是下面顯示(toString)出的訊息卻是有值...??? 有看到 handler...是lazyInitatial 但是 jpa 的 finaAll() 為啥會是 lazy... 更神奇的是,我檢查其他頁面所有的 jpa findAll 都是正常的, 就唯一在某個 table 的某一個值出現... 此例為 Catalog Catalog 是跟 Product 關係為一對多 比較可靠的猜測是當我讀取 Product 時有 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cid") private Catalog catalog; 所以被設定到了...? (不過其他更複雜關係的table都沒有出現此問題,catalog是唯一 出問題的) 可是看了 java doc,並沒有說明 findAll() 這個 function 會有 lazy 的情況... 請問是我哪邊觀念錯了嗎? 或是有哪個點可以切入去 debug ? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.218.64.133 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1408101358.A.0B4.html
cyclone350: 問題應該等同於http://ppt.cc/Qr7S 08/15 19:32
cyclone350: 以解決,這是Hibernate __的機制,若要用reflection 08/15 21:16
cyclone350: 可以用 Hibernate.getClass 之類的方法取得 08/15 21:17
cyclone350: real Object instance 08/15 21:17