繁体   English   中英

无法在HIbernate 4中保持OneToMany关系

[英]Unable to persist OneToMany relationship in HIbernate 4

休眠时获取数据仍然存在问题

我声明了两个独立的类,即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遵循工作单元模式

您打开工作单元,将更改应用于与其关联的对象,并且当您关闭工作单元时,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(); 
}

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM