Связывание Java JPA, Swing и Beans: изменения в коллекции OneToMany в сущности, которые не сразу отражаются в GUI
Я пытаюсь изучить JPA с Hibernate и привязать его к GUI, встроенному в Netbeans с Beans Binding. Это приложение со списком собак. У каждой собаки может быть от одного до многих щенков. Вы можете добавлять и удалять собак, а для каждой собаки вы можете добавлять и удалять щенков.
Собаки отображаются в JList, когда пользователь выбирает собаку, ее свойства отображаются в JTextFileds, а ее щенки отображаются в JTable. Добавление / удаление собак работает нормально, потому что список, содержащий экземпляры собак, можно наблюдать.
Собаки-щенки содержатся в классе "Коллекция в собаках" с помощью метода получения и установки:
@OneToMany(targetEntity = Puppie.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "dog_id")
private Collection<Puppie> puppies;
public Collection<Puppie> getPuppies() {
if (puppies == null) {
puppies = new ArrayList<Puppie>();
}
return puppies;
}
public void setPuppies(Collection<Puppie> puppies) {
Collection<Puppie> oldPuppies = this.puppies;
this.puppies = puppies;
changeSupport.firePropertyChange("puppies", oldPuppies, puppies);
}
Когда я добавляю щенка к собаке, выбранной в JList, она не сразу отражается в JTable. Я должен выбрать другую собаку, а затем повторно выбрать собаку, к которой я добавил щенка, чтобы он появился в JTable. Я использую следующие методы добавления / удаления щенков в классе Dog:
public void addPuppie(Puppie puppie) {
getPuppies().add(puppie);
}
public void deletePuppie(Puppie puppie) {
getPuppies().remove(puppie);
}
JTable привязан к JList (а не к списку собак) с ${selectedElement.puppies} в качестве выражения привязки.
Установщики в свойстве огня класса Puppie изменяются, когда свойства установлены.
Вот код для добавления щенка:
@Action
public void addPuppy() {
Puppie p = new Puppie();
p.setName("new puppie");
entityManager.persist(p);
int selectedIndex = dogsJList.getSelectedIndex();
Dog d = (Dog) dogList.get(selectedIndex);
d.addPuppie(p);
setSaveNeeded(true);
}
Любая помощь будет принята с благодарностью! Дайте мне знать, если вам нужна дополнительная информация.
С уважением, Хенрик
2 ответа
Кажется, что JTable не обновляется автоматически. Глядя на сгенерированный Netbeans код, он очищает выделение в JList, а затем повторно выбирает запись, и, таким образом, обновляется JTable.
Поскольку Netbeans генерирует этот код, я предполагаю, что второй JTable не может быть автоматически обновлен с помощью привязки bean, и что необходимо очистить выбор в JList, а затем повторно выбрать запись.
Я думаю, вы должны изменить метод addPuppie:
public void addPuppie(Puppie puppie) {
getPuppies().add(puppie);
changeSupport.firePropertyChange("puppies", oldPuppies, puppies);
}
Потому что PropertyChangeEvent должен быть запущен при смене коллекции щенков.