java - Hibernate:如何刷新子实体

标签 java hibernate

我有一个“登录”域对象:

public class Login extends AuditEntity {

private static final long serialVersionUID = -309839789761736747L;

private String userName;
private String password;
private Timestamp lastLogin;
private Set customers = new HashSet(0);
private Set addresses = new HashSet(0);

public Set getCustomers() {
    return this.customers;
}

public void setCustomers(Set customers) {
    this.customers = customers;
}

public Set getAddresses() {
    return this.addresses;
}

public void setAddresses(Set addresses) {
    this.addresses = addresses;
}
   //Other setter, getters

这是来自 hibernate 映射文件的片段:

        <set name="customers" fetch="select" lazy="false">
        <key>
            <column name="LoginID" />
        </key>
        <one-to-many class="com.domain.Customer" />
    </set>
    <set name="addresses" fetch="join" lazy="false">
        <key>
            <column name="LoginID" />
        </key>
        <one-to-many class="com.domain.Address" />
    </set>

登录引用的 Address.hbm.xml 映射如下所示:

    <many-to-one name="login" class="com.domain.Login"
        fetch="join" lazy="false">
        <column name="LoginID" />
    </many-to-one>

这是我的 Spring 测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
public class LoginDaoTest {

@Autowired
private BaseDao<Login, Integer> loginDao;

@Autowired
private BaseDao<Address, Integer> addressDao;

@Test
public void testLoginDao() {
    Login login = loginDao.load(1);
    Set<Address> addresses = login.getAddresses();

    System.out.println("size Before save..." + addresses.size());

    Address address = new Address();
    address.setCity("Kew gardens");
    address.setCreatedBy("user");
    address.setCreatedDate(new Timestamp(Calendar.getInstance().getTime().getTime()));
    address.setHouseNumber("1-2-3");
    address.setLogin(login);
    address.setLocality("Queens blvd");
    address.setState("NY");
    address.setStreetName("Some Street");
    address.setZipCode("11415");

    addressDao.save(address);

    System.out.println("size After save..." + addresses.size());

}

这是输出:

size Before save...14
size After save...14

问题/问题 在添加新地址后,我希望看到登录对象中设置的地址增加一个,因为我没有延迟加载。为什么我的集的大小没有增长?是因为我在同一个事务中运行查询吗?

谢谢。

最佳答案

您负责维护对象的内存状态。 Hibernate 不会自动将该地址粘贴到列表中。要编写严格正确的代码,您应该在创建新地址时将其添加到列表中,以便您的内存状态与您打算保留的内容相匹配。

然后您可以使用传递持久性来创建新地址,根本不需要对地址调用“保存”。

从概念上讲,它的工作方式与您的预期相反。该框架的目的不是神奇地将数据库“绑定(bind)”到您的对象上。它让您可以像没有数据库时那样使用普通对象(例如,将事物放入它们所在的列表中),并神奇地持久化您的对象状态。

关于java - Hibernate:如何刷新子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10186541/

相关文章:

java - 使用相关表中的 FK 列值更新表

java - JPA Hibernate删除实体的子对象,与双PK触发SQL更新而不是删除连接?

java - 从外部文件获取 JPA 凭据

java - Allure :目标文件夹中的环境文件在 maven clean 上被删除。我如何在每次构建时生成它?

java - keystore 类型 : which one to use?

java - MVC 中 Hibernate 延迟属性初始化的最佳实践?

java - 没有名为 X 的 EntityManager 的持久性提供程序 - JPA

spring - 嵌套异常是 org.springframework.dao.InvalidDataAccessResourceUsageException - 无法执行查询(Spring 和 Hibernate)

java - FeignClient 将 GET 方法转换为 POST

java - Java如何计算三角函数