java - 为什么延迟获取不工作 JPA

标签 java hibernate jpa jboss-arquillian glassfish-embedded

我很难理解延迟抓取,因为我在书中读到它时没有工作,他们说在延迟抓取中,jpa 只会在实体通过 geters 访问时加载它们,所以我创建了一个 Arquillian项目来测试这个概念,但它不起作用。 这是我的两个实体

package com.actionbazaar.model;

@Entity
@TableGenerator(
        initialValue = 5,
        name = "PERSON_SEQ",
        table = "PERSON_SEQ_TABLE",
        pkColumnName = "SEQ_NAME",
        pkColumnValue = "PERSON",
        valueColumnName = "SEQ_VALUE")
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String fname;
    private String lname;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.PERSIST)
    List<Address> addresses;
    //getters and setters 
}

地址

    @Entity
public class Address implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String city;
    private String zip;
    private String street;

    @ManyToOne
    private Person owner;
//getters and setters
}

我有一个使用这种方法的无状态 session bean

    public Person getFirstPerson() {
    Person p = em.find(Person.class, 1);
    em.detach(p);
    //why this call does not create an exception
    p.getAddresses().get(0);
    return p;
}

因为我在访问地址之前分离了实体,所以地址列表应该是空的,当我分离它时,它不再由实体管理器管理,所以我不应该为这个人获取地址 问题是我可以获取那个人的地址,即使我有地址字段的延迟获取并在访问地址字段之前分离实体!!!! 请一些人有解释。

另一个测试

Person p= myStatlessSessionBean.getFirstPerson();
myOtherStalessSesionBean.moveAllPeopleToCity("NY");
if(p.getAddresses().get(0).getCity().equals("NY"))
{
  system.out.prinln("person moved");
}
else {
system.out.prinln("person did not move");
} //prompts person did not move

最佳答案

是的,伙计,你是对的。你在这里没有做错任何事。我刚刚打开 Pro JPA 2,第 2 版书籍,发现了这个:

here is the snapshot

您正在使用 glassfish-embedded 这实际上是导致问题的原因。你的代码没有问题。正如上述书籍的作者所说,

Some vendors might attempt to resolve the relationship, while others might simply throw an exception or leave the attribute uninitialized.

因此,在您的情况下,关系已解决而不是延迟加载。只需使用其他供应商实现相同的示例,您就不会遇到任何问题。这里使用 glassfish-embedded,lazyfetch 不起作用。否则应抛出异常,因为变量 p 已分离。

这是 link我也在哪里阅读了这条美丽的信息

这是来自上面链接的快照 snapshot

关于java - 为什么延迟获取不工作 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42328532/

相关文章:

java - 使用 SSL 实现 CAS 时出现 "NoSuchFlowExecutionException"异常

hibernate - 批量插入时,某一行出错时如何继续插入其他行

java - JPA 和默认锁定模式

java - Singleton 中具有上下文类型 TRANSACTION 的 EntityManager 是否会加入外部 bean 管理的事务?

java - 使用while暂停整个java程序有危险吗?

java - Struts -Hello World - HTTP 状态 [404]

Java在运行时设置时区

Hibernate 级联 vs 手动删除

hibernate - 如何为不重复的数据库实体生成默认名称?

jpa - 使用 CDI + WS/RS + JPA 构建应用程序