Связывание Java JPA, Swing и Beans: изменения в коллекции OneToMany в сущности, которые не сразу отражаются в GUI - PullRequest
1 голос
/ 06 августа 2010

Я пытаюсь изучить 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 ]

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

Я думаю, вы должны изменить метод addPuppie:

public void addPuppie(Puppie puppie) {
   getPuppies().add(puppie);
   changeSupport.firePropertyChange("puppies", oldPuppies, puppies);
} 

Поскольку PropertyChangeEvent должен запускаться при смене коллекции щенков.

0 голосов
/ 10 августа 2010

Кажется, что JTable не обновляется автоматически. Глядя на сгенерированный код NetBeans, он очищает выделение в JList, а затем повторно выбирает запись, и, таким образом, обновляется JTable.

Поскольку Netbeans генерирует этот код, я предполагаю, что второй JTable не может быть автоматически обновлен с помощью привязки bean, и что необходимо очистить выбор в JList, а затем повторно выбрать запись.

...