2010-07-21 165 views
1

JPA規範或官方文檔中是否存在關於某些JPA實現的任何陳述,這些實現描述了當我們註釋實體方法時以及註釋實體字段時的行爲?在JPA(Hibernate)中註釋字段和方法的區別?

就在幾個小時前,我遇到了一個醜陋的問題:我用MS SQL Server使用JPA(通過Hibernate,但沒有任何Hybernate特定的Java代碼)。我把所有註釋放在實體的字段上(我更喜歡這種風格直到今天)。

當我查看數據庫時,發現所有應該在前鍵和應該包含一些整數(ID)的表列中實際上有varbinary(255, null)類型和包含某些東西的哈希值(我不知道那是什麼,但是它看起來像一個典型的MD5哈希)。

最令人沮喪的是,該應用程序正常工作。但偶爾(在更新)我得到了MS SQL異常,它聲明我試圖插入太長的值和數據不能被截斷。

最後(作爲實驗)我從實體字段中刪除所有註釋,並將它們全部放在方法上。我重新創建了DB,並且所有表格都包含完美的FK列。這些列存儲整數(ID,如1,3,4 ...)。

那麼,有人可以解釋那是什麼嗎?

我發現this SO thread它被接受的答案說,首選的方法是把註釋放在字段上。至少對於我的具體情況,我可以說這不是真的。

+0

由於某種原因,到SO線程的鏈接不正確。 – 2010-07-21 23:11:12

+0

@Vineet雷諾茲:謝謝!現在它是正確的。 – Roman 2010-07-21 23:15:36

+1

可能的重複[Hibernate註釋 - 哪個更好,字段或屬性訪問?](http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access) – 2010-07-21 23:21:23

回答

0

根據經驗,我做了以下工作。

  1. 我把實體的細節在實體類定義的頂部,(架構,行限制等),例如....

    @Entity 
    @Table(name="MY_TABLE", schema = "MY_SCHEMA", uniqueConstraints = @UniqueConstraint(columnNames = "CONSTRAINT1")) 
    
  2. 對於定義的字段,我做不要把註解字段聲明,而是在getter方法這些領域

    @Column(name = "MY_COL", table="MY_TABLE", nullable = false, length = 35) 
    public String getMyCol() { 
        return this.myCol; 
    } 
    
    public void setMyCol(String myCol) { 
        this.myCol = myCol; 
    } 
    
0

JPA允許s用於兩種類型的持久類數據的訪問。字段訪問意味着它將實例變量(字段)映射到數據庫和屬性訪問中的列,這意味着它使用獲取器來確定將映射到數據庫的屬性名稱。使用哪種訪問類型取決於你在何處放置@Id註釋(在ID字段或getId()方法上)。