相关实体未加载 - EAGER被忽略了吗?

时间:2012-04-23 08:25:01

标签: jpa ejb eclipselink glassfish-3

获得GlassFish v3。我有一对多的实体。问题是,EclipseLink似乎忽略了获取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 - 存储数据有效。但是,如果我只获取数据,则返回该人 - 而不是爱好。 Coudld你告诉我我的代码有什么问题吗?

编辑抱歉已经尝试了很多东西......上面显示的代码产生:

  

异常描述:试图遍历a   使用具有空会话的间接关系。经常这样   当具有未实例化的LAZY关系的n实体是   序列化和之后的遍历关系   序列化。为了避免这个问题,请确认LAZY   序列化之前的关系。

但是人员正确归还。为什么我在使用EAGER时指定了LAZY?

2 个答案:

答案 0 :(得分:1)

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

您确定收到此属性的错误,而不是另一个错误吗?

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

答案 1 :(得分:0)

制作热切的对象Serializable