休眠时获取数据仍然存在问题
我声明了两个独立的类,即License和MacAddress。 MacAddress可以单独存在,但也可以链接到许可证,当休眠生成基础表时,它会创建一个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;
}
}
MAC地址
@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是否已与许可证相关联(可以将多个macaddress与许可证相关联),如果不存在,则我们要存储macaddress以及许可证和macaddress之间的链接。
但是,尽管在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;
为什么我不能让两者之间的关系持久化?
最佳答案
将更改保存到数据库时,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();
}
也可以看看:
13.1.1. Unit of work