【发布时间】: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