gpt4 book ai didi

java - eclipselink 不获取列表

转载 作者:行者123 更新时间:2023-11-30 06:37:29 24 4
gpt4 key购买 nike

有两个实体类:

@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 中除了空集合之外还有其他东西,但根据我的观察,没有。为什么?

最佳答案

Now, I would like to pick a place and view all its events (...) and I would think that there's something more than empty collection in p.events, but there is not - based on my observations. Why?

我的观察是您显示的代码中的事件LAZY:

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

那么,当准确加载给定的 Place 时,您是如何得出它们为空的结论的?您是否尝试对集合调用 size() 以强制加载(或迭代集合项)?

不管上面问题的答案如何,我的建议是

  • 激活 SQL 日志记录(并在必要时在 SQL 客户端中运行查询)以查看发生了什么。
  • 如果您想急切地加载事件,也许实际上可以使用fetch join:

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

关于java - eclipselink 不获取列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com