2012-09-18 79 views
0

有得到一些數據堅持用休眠無法堅持冬眠4

問題一對多的關係,我宣佈兩個獨立的類別,許可證和MACADDRESS。 MacAddress可以獨立存在,但也可以鏈接到許可證,當hibernate生成基礎表時,它會創建一個License,MacAddress和License_MacAddress表。

許可證

@Entity 
public class License 
{ 
    @Id 
    @GeneratedValue 
    private Integer  id; 

    @Column(nullable = false) 
    private String  license; 

    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
    private 
    List<MacAddress> macAddresses; 

    public Integer getId() 
    { 
     return id; 
    } 

    public void setId(Integer id) 
    { 
     this.id = id; 
    } 

    public String getLicense() 
    { 
     return license; 
    } 

    public void setLicense(String license) 
    { 
     this.license = license; 
    } 

    public List<MacAddress> getMacAddresses() 
    { 
     return macAddresses; 
    } 

    public void setMacAddresses(List<MacAddress> macAddresses) 
    { 
     this.macAddresses = macAddresses; 
    } 
} 

MACADDRESS

@Entity 
public class MacAddress 
{ 
    @Id 
    @GeneratedValue 
    private Integer  id; 

    @Column(nullable = false) 
    private String  macAddress; 


    public Integer getId() 
    { 
     return id; 
    } 

    public void setId(Integer id) 
    { 
     this.id = id; 
    } 

    public String getMacAddress() 
    { 
     return macAddress; 
    } 

    public void setMacAddress(String macAddress) 
    { 
     this.macAddress = macAddress; 
    } 
} 

什麼即時試圖做的是以下幾點。

在某一點上創建一個新的許可證和行存儲在授權表(此工作正常)

然後在以後的時間,用戶的許可,並MACADDRESS被接收。從數據庫中檢索許可證,我們檢查提供的macAddress是否已經與許可證關聯(多個macaddresses可以與許可證關聯),如果沒有,我們則要存儲macaddress和許可證與macaddress之間的鏈接n。

儘管在License的@OneToMany註釋中設置了CascadeType.ALL,但沒有存儲Mac地址信息。我可以通過單獨保存該對象來手動保存MacAddress,但License_MacAddress表仍然爲空。

代碼

session = Db.getSession(); 
License license = getLicense(session, licenseStr); 
List<MacAddress> macAddresses = license.getMacAddresses(); 
for(MacAddress mac:macAddresses) 
{ 
    if(mac.getMacAddress().equals(macAddress)) 
    { 
     return; 
    } 
} 

MacAddress mac = new MacAddress(); 
mac.setMacAddress(macAddress); 
session.save(mac); 
license.getMacAddresses().add(mac); 
session.saveOrUpdate(license); 
return; 

爲什麼我不能得到持續兩者之間的關係?

回答

1

當保存對數據庫的更改時,Hibernate遵循Unit of Work pattern

您打開工作單元,將更改應用到與其關聯的對象,並在關閉工作單元時,Hibernate自動保存更改。

在Hibernate API的實際使用工作單元的概念通常是相匹配的Hibernate事務,因此,你需要在這種情況下,交易:

session = Db.getSession(); 
Transaction tx = null; 
try { 
    tx = session.beginTransaction(); 
    License license = getLicense(session, licenseStr); 
    List<MacAddress> macAddresses = license.getMacAddresses(); 
    for(MacAddress mac:macAddresses) 
    { 
     if(mac.getMacAddress().equals(macAddress)) 
     { 
      return; 
     } 
    } 

    MacAddress mac = new MacAddress(); 
    mac.setMacAddress(macAddress); 
    license.getMacAddresses().add(mac);  
    tx.commit(); 
} catch (RuntimeException e) { 
    if (tx != null) tx.rollback(); 
    throw e; // or display error message 
} finally { 
    session.close(); 
} 

參見:

+0

謝謝,就是這樣,完全忘記了交易,我認爲這是因爲m y createLicense方法沒有使用事務或者工作我猜這是因爲它只更新了一個實體和表而Hibernate創建了這個簡單情況下的transcation隱含性? –