eclipselink не получает список - PullRequest
2 голосов
/ 12 августа 2010

есть два класса сущностей:

@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
}

сгенерированные таблицы:

<code>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 ]

2 голосов
/ 18 августа 2010

Теперь я хотел бы выбрать место и просмотреть все его события (...) и подумать, что в 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
    
2 голосов
/ 17 августа 2010

Вы вызываете p.getEvents (). Size () или проверяете атрибут в отладчике? Если он находится в отладчике, то вы можете увидеть артефакты загрузки Lazy, которые будут пустыми до тех пор, пока не будет получен доступ к коллекции. Попробуйте вызвать p.getEvents (). Get (0) и посмотрите, что вы получите.

1 голос
/ 17 августа 2010

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
0 голосов
/ 12 августа 2010

Может быть проблема в вашем EJB-методе getPlaceWithId - не уверен, как вы ищите свои сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...