【问题标题】:Related entities not loaded - EAGER ignored?未加载相关实体 - EAGER 被忽略?
【发布时间】:2012-04-23 08:25:00
【问题描述】:

获得了 GlassFish v3。我有一个一对多的实体。问题是,EclipseLink 似乎忽略了 fetch EAGER 模式。

这是我的实体。

@Entity
public class Person implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
    private List<Hobby> hobbies;

    // getter and setter
}

1:n 关系

@Entity
public class Hobby
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;    

    private String name;

    @ManyToOne
    @JoinColumn
    private Person person;

    // getter and setter
}

还有豆子

@javax.ejb.Remote
public interface Testing
{
    public void addTestData();
    public List<Person> getTestData();
}

@javax.ejb.Stateless
public class TestingBean implements Testing
{
    @javax.persistence.PersistenceContext
    private EntityManager entityManager;

    public void addTestData()
    {
        Person p = new Person();
        p.setName("JOE");
        entityManager.persist(p);

        Hobby h1 = new Hobby();
        h1.setName("h1");
        h1.setPerson(p);

        entityManager.persist(h1);              
    }

    public List<Person> getTestData()
    {
        TypedQuery<Person> gridQuery = entityManager.createQuery("SELECT e FROM Person e", Person.class);
        return gridQuery.getResultList();
    }
}

编辑客户:

InitialContext context = new InitialContext();      
Testing test = (Testing)context.lookup("java:global/dst2_1/TestingBean");

test.addTestData();

for(Person p: test.getTestData()) {
    System.out.println(p.getName());
    for(Hobby b : p.getHobbys()) {                  
        System.out.println(b.getName());
    }
}

context.close();

使用MySQL - 存储数据有效。但是,如果我获取数据,则只返回该人-而不是爱好。你能告诉我我的代码有什么问题吗?

编辑抱歉已经尝试了这么多东西...如上所示的代码产生:

异常描述:试图遍历一个 使用具有空会话的间接关系。这往往 当具有未实例化的 LAZY 关系的 n 个实体是 序列化并在之后遍历该惰性关系 序列化。为了避免这个问题,实例化 LAZY 序列化之前的关系。

但是 Person 被正确返回。为什么在我使用 EAGER 时它会指定 LAZY?

【问题讨论】:

  • 你能展示你用来获得爱好的代码吗?
  • 你是说客户?我已经更新了我的帖子:)
  • 您正在填充 p.hobbies 集合吗?如果不是,这就是为什么当你读回 person 实体时它会是空的。您必须维护双向关系的双方,以便缓存与数据库中的内容一致。至于 Lazy,您能否提供更多关于它发生在哪个关系以及堆栈跟踪的信息?
  • @Chris:我还尝试在插入后刷新/清除 EntityManager ... 最后一次调用是 org.eclipse.persistence.exceptions.ValidationException.instantiatingValueholderWithNullSession(ValidationException.java:979)
  • EclipseLInk 使用刷新/清除可能不会触及的二级缓存 - 您必须使用刷新查询提示或调用 em.refresh(p);虽然最好在关系发生变化时更新关系的双方。至于异常,能不能把全栈贴出来?

标签: jpa ejb eclipselink glassfish-3


【解决方案1】:

您的代码看起来正确。我看不出任何可以忽略 EAGER 的方式。

你确定你得到的是这个属性的错误,而不是另一个?

还要确保正确地重新编译和部署代码。您最喜欢部署旧版本。

【讨论】:

  • 是的 - 我昨天在那个问题上花了 10 个小时 ;) 多次重新启动域 - 部署工作 [抛出一些自定义异常以检查它是否正确部署]。我的一位同事在他的机器上遇到了同样的问题。我必须使用“Glassfish v3 final”——一个相当旧的版本。在休眠中试过 - 工作。也许有一个错误?同样有趣的是,如果注释在变量上,它的行为与在 getter 上的行为不同:在 getter 上 eclipselink 创建一个链接表?!
  • 如果它在getter上并且你得到一个链接表,那是因为注释被忽略了。您不能在实体上混合注释类型 - 它们必须都在属性上,或者都在字段上。
  • 非常感谢!!!设置两个方向是问题 - 现在可以了。注释现在在所有变量上
【解决方案2】:

制作渴望的对象Serializable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2016-04-04
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多