GlassFishv3を入手しました。私は1対多のエンティティを持っています。問題は、それ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
-データの保存は機能します。しかし、データを取得すると、趣味ではなく、その人だけが返されます。私のコードの何が問題なのか教えてください。
EDIT申し訳ありませんが非常に多くのことを試みました...上記のように示されているコードは生成します:
例外の説明:セッションがnullの間接参照を使用して関係をトラバースしようとしました。これは、インスタンス化されていないLAZY関係を持つエンティティがシリアル化され、その遅延関係がシリアル化後にトラバースされる場合によく発生します。この問題を回避するには、シリアル化の前にLAZY関係をインスタンス化します。
しかし、Personは正しく返されます。EAGERを使用しているのになぜLAZYを指定するのですか?