2009-07-03 51 views
0

考慮下面的代碼:休眠不取公共成員

@Entity 
@Table(name = "a") 
public class A implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="id") 
    public int id; 

    @Transient 
    public B b; 

    public B getB() 
    { 
     return B; 
    } 
} 

當我取A,我手動填充B(另一休眠實體)。如果我嘗試通過使用a.b訪問,那麼它失敗,但是,如果我用戶a.getB();那麼它成功了。

這是爲什麼?

回答

1
  1. 類成員應該永遠是私有的!
  2. 如果您的對象連接到Hibernate Session,那麼您正在使用代理。所以,如果你想直接訪問你的類成員(這是不好的!),你必須首先分離對象。
+0

我假設你的意思是,類成員應該始終是私人的,是的,我同意,但我繼承了這些代碼,並且必須在JSP中更改成千上萬的引用,因此不太可能發生。 – Jesse 2009-07-03 18:52:02

+0

好吧,我希望搞砸的架構不是你的錯,然後;)。但是你有沒有試圖分離物體?我想,基於這樣的體系結構,使用了OpenSessionInViewFilter(或(反 - )「模式」)),因此該對象不會在請求內被分離。 您必須記住,實際的對象是代理,並且對成員和方法的訪問依賴於持久性管理器的策略或實現。 Hibernate假定遵循一些規則,比如不直接訪問成員。 – cafebabe 2009-07-03 19:16:08

1

聽起來像一個懶惰的提取問題。當您嘗試直接訪問它時,公共引用爲null,但是當您使用「get」時,Hibernate知道調用數據庫併爲您提供該實例。

+0

這就是它聽起來像我的,除了我可以調用a.getB(),然後調用A·B和A·B仍然失敗。 – Jesse 2009-07-03 18:11:07

0

由於B字段是短暫的。

是否有必要爲它是短暫的?嘗試刪除它。