eclipselink无法获取列表

时间:2010-08-12 18:36:23

标签: java orm jpa persistence eclipselink

有两个实体类:

@Entity
public class Place implements Serializable {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
    @OneToMany(mappedBy = "place")
    private List<Event> events = new ArrayList<Event>();
    private String name;
//getters setters
}
@Entity
public class Event implements Serializable {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id;
    @OneToMany(mappedBy = "event" , cascade={CascadeType.PERSIST})
    private List<Participant> participants = new ArrayList<Participant>();
    @ManyToOne(optional=false,fetch=FetchType.EAGER) private Place place;
    private String name;
// getters setters
}

生成的表格:

mysql> desc EVENT;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| ID       | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| NAME     | varchar(255) | YES  |     | NULL    |                |
| PLACE_ID | bigint(20)   | YES  | MUL | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
mysql> desc PLACE;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| ID       | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| LOCATION | varchar(255) | YES  |     | NULL    |                |
| NAME     | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
现在,我将编写一些Java代码,以便Place和Event表以这种方式显示:

+----+--------+
| ID | NAME   |
+----+--------+
|  1 | Prague |
+----+--------+
+----+-------------+----------+
| ID | NAME        | PLACE_ID |
+----+-------------+----------+
|  1 | Programming |        1 |
+----+-------------+----------+

现在,我想选择一个地方并查看其所有活动:

// there's an ejb talking with persistence layer 
Place p = ejb.getPlaceWithId(1);
而且我认为p.events中除了空集合之外还有其他东西,但根据我的观察,没有。为什么呢?

4 个答案:

答案 0 :(得分:2)

您是在调用p.getEvents()。size()还是在调试器中检查属性?如果它在调试器中,那么您可能会看到在访问集合之前将为空的Lazy加载工件。尝试调用p.getEvents()。get(0)并查看你得到的内容。

答案 1 :(得分:2)

  

现在,我想选择一个地方并查看其所有事件(...),我认为p.events中除了空集合之外还有其他东西,但根据我的观察,没有。为什么?

我的观察是您所显示的代码中的eventsLAZY

@OneToMany(mappedBy = "place")
private List<Event> events = new ArrayList<Event>();

那么你是如何得出这样的结论:在完全加载给定Place时它们是空的?您是否尝试在集合上调用size()来强制加载(或迭代集合项)?

无论上述问题的答案如何,我的建议都是

  • 激活SQL日志记录(并在必要时在SQL客户端中运行查询)以查看发生的情况。
  • 如果您想急切加载fetch join,可能实际使用events

    SELECT p FROM Place p join fetch p.events WHERE p.id = :id
    

答案 2 :(得分:1)

1)

@OneToMany(mappedBy = "place", fetch = FetchType.EAGER)
private List<Event> events = new ArrayList<Event>();

做到了。

2)或

Place p = ejb.getPlaceWithId(1);
p.getEvents().size(); // will force the fetch

答案 3 :(得分:0)

您的EJB方法getPlaceWithId可能存在问题 - 不确定您是如何查找实体的。