2012-09-18 75 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隐含性? –