有两个实体类:
@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
中有比空集合更多的东西,但是根据我的观察,没有。为什么? 最佳答案
现在,我想选择一个位置并查看其所有事件(...),我认为p.events中除了空集合之外还有其他东西,但是根据我的观察,没有。为什么?
我的观察结果是,在显示的代码中events
是LAZY
:
@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