2012-10-04 60 views
0

我是新來的春季和冬眠,所以考慮到你的答案。Spring + Hibernate:如何實現Entites和DAO

我有很多一對多的關係進行了鏈接表還必須包含的信息。我會嘗試這種根據解決:

How Do I Create Many to Many Hibernate Mapping for Additional Property from the Join Table?

我的問題是關於:

hibernate: Custom code on insert/update

但我只是重複了這裏,所以需要在鏈接沒有點擊:

可以說我們有顏色。用戶可以創建n種顏色的混合物並將該混合物存儲在數據庫中。稍後,如果用戶搜索顏色「藍色」,則應顯示所有包含藍色的混合物。

業務規則是,任何顏色只應在數據庫中一次。所以如果插入一個新混合物,必須首先檢查所有顏色是否已經存在於數據庫中,如果是,應該重新使用(引用)該顏色,如果不是,則應該創建一個新的混合物。

如果混合物發生變化,說「藍色」替換爲「紅色」,則行爲必須是初始「藍色」保持不變,並且系統檢查是否存在「紅色」,並重新使用或創建它,然後將其添加到混合物中。

的重要組成部分,是「顏色」是由系統管理和現有的顏色必須永遠不會改變。「紅」永遠是「紅」,絕不應改爲「藍色」。由於我是Hibernate和Spring的新手,我對於如何實現這個規則以及在什麼級別上感到失望.IMHO我會將該邏輯放在最低級別,以便在您(開發人員)忘記檢查它。那有意義嗎?更好的想法或建議?

回答

0

所以在這裏我目前的解決方案:

  1. 唯一約束顏色
  2. 在DAO更新方法檢查如果顏色已經更新存在於數據庫中。如果是使用它,如果沒有創建一個新
  3. 2點有一個問題,如果改變顏色和更新的同一個Hibernate Session發生。然後它會將該顏色從紅色更新爲藍色,因爲在2.中完成的查詢將始終返回我們正在更新的顏色!我通過將@Immutable添加到Color實體類來解決此問題。

碼2。

public Color update(final Color color) { 
    SQLQuery query = this.getCurrentSession().createSQLQuery(
     "select * from colors where color = :color") 
     .addEntity(Color.class);   
    query.setString("color", color.getColor()); 
    Color result = (Color) query.uniqueResult(); 
    if (result == null) { 
     Color newColor = 
       new Color(color.getColor()); 
     this.getCurrentSession().persist(newColor); 
     return newColor; 
    } else { 
     return (Color) this.getCurrentSession().merge(result); 
    } 
} 
0

如果我們可以用顏色和混合相同的例子,它們可能看起來像這樣:

public class Color { 
    String name; 
    List<Mixture> mixtures; 
    public String getName() { return name; } 
    ...  
} 

public class Mixture { 
    String name; 
    List<Color> colors; 
} 

所以我想,以確保您的顏色永遠不會改名爲最簡單的方法,你只是不提供一個二傳手setName。確保你的顏色不會被刪除變得有點棘手。但是,如果您要爲持久性提供DAO方法,則不要提供deleteColor方法。

我不知道,如果這是一個非常強烈的要求不能夠刪除未使用(沒有任何引用的混合物)的顏色 - 什麼是從這個增益?對於那些被引用的數據庫,將會有數據庫中的參照完整性約束 - 或者至少應該有。

+0

如果顏色未被使用,您可以將其刪除。但假設我將「紅色」和「藍色」的混合物更改爲「綠色」和「藍色」。檢查是否可以刪除「紅色」只是增加開銷。但我想你不會檢查,只是刪除它,並依靠數據庫限制刪除?但是,那麼你基本上必須添加邏輯來吞嚥在限制上拋出的異常?如果我沒有名字的setter,加載實體時hibernate將如何填充該字段?是不是要求? –

+0

什麼是刪除的用例?它是從UI驅動的,因此依靠數據庫限制是一個有效的例子。如果color.mixtures.size()> 0,那麼在業務層中進行檢查也沒有太大的害處。在二傳手問題上,我認爲你是對的。對不起,誤導。在這種情況下,您可能希望將其限制在DAO級別上,即不要提供'updateColor'方法。也就是說,降低一級可以通過EntityManager持久/合併Color對象。 – maksimov