JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? [精華]
smallufo





發文: 57
積分: 2
於 2004-12-31 15:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近在 map 一個 legacy forum , 使用 PHP 寫的。大體的架構不脫 Board / Post / User 的架構
每篇 Post 有一組 PosterId,BoardId 分別指向 User 以及 Board 的 PK
如果以 Hibernate 來 Map 這個 Post Class , 寫法如下:
1
2
3
4
5
6
7
8
9
   <class name="Post" table="Posts">
      <cache usage="read-only"/>
      <id name="number" column="B_Number" type="long">
         <generator class="native"/>
      </id>
      <property.../> //跳過
      <many-to-one name="poster"    column="B_PosterId" class="User" />
      <many-to-one name="board"     column="B_Board"    class="Board"/>
   </class>

這樣的 mapping 沒有問題...

但是...

由於這個 forum 執行已久,可能因為當時程式問題,造成一些 broken model
最明顯的是,某些 Post.PosterId 在 User 中找不到對應的 PK
意思是,該使用者已經被刪除了,但是板面仍有他的文章

這樣子會對 Hibernate 造成 UnresolvableObjectException

我不想要 lose 這些文章,我希望當 Post.poster 出槌時,系統塞一個 Dummy 的 User 給 Post.poster , 因此嘗試撰寫 PostInterceptor :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class PostInterceptor implements Interceptor
{
  public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException
  {
    if (entity instanceof Post)
    {       
        if (("poster").equals( propertyNames[i]))
        {
          if (state[i] == null)
          {
            User u = new User();
            u.setNumber(1);
            u.setUsername ("Invalid_User");
            u.setEmail("INVALID@NON_EXIST.COM");
            u.setPassword("XXX");
            state[i] = u;
          }
        }
      }
    }//if
    return false;
  }
} 


但是似乎 Interceptor.onLoad() 不做這樣的事,
FK 的錯誤不會被 Interceptor 給攔截

因此想請問各位,有沒有遇過這樣的問題?有沒有其他的解決方案?

參考 JIRA HB-785 : http://opensource.atlassian.com/projects/hibernate/browse/HB-785

Gavin King 似乎不想理會 Broken Data Model ... Black Eye


reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
5370 [精華] [Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? smallufo 1766 2004-12-31 15:57
4707 Re:[Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? Forth 76 2004-12-31 17:30
4725 Re:[Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? smallufo 812 2004-12-31 22:47
4677 Re:[Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? Forth 60 2005-01-01 00:23
4678 Re:[Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? hkdennis2k 93 2005-01-01 00:43
4718 Re:[Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? ingramchen 22 2005-01-01 00:23
5336 Re:[Hibernate] 當 Foreign Key 出槌時,有辦法從中攔截嗎? smallufo 96 2005-01-01 00:46
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8