1

我正在尝试使用 Hibernate 学习 JPA,并将其绑定到带有 Beans Binding 的 Netbeans 中内置的 GUI。这是一个列出狗的应用程序。每只狗可以养一只到多只小狗。您可以添加和删除狗,并且可以为每只狗添加和删除小狗。

狗显示在 JList 中,当用户选择狗时,它的属性显示在 JTextFileds 中,它的小狗显示在 JTable 中。添加/删除狗可以正常工作,因为包含 Dog 实例的列表是可观察的。

Dogs 小狗使用 getter 和 setter 维护在 Dog 类的 Collection 中:

@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 以 ${selectedElement.puppies} 作为绑定表达式绑定到 JList(而不是狗列表)。

当设置属性时,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);
}

任何帮助将不胜感激!如果您需要更多信息,请与我们联系。

问候, 亨里克

4

2 回答 2

2

我认为,您必须更改 addPuppie 方法:

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

因为在更改小狗集合时必须触发 PropertyChangeEvent。

于 2010-08-06T12:52:17.700 回答
0

JTable 似乎没有自动更新。通过查看 Netbeans 生成的代码,它会清除 JList 中的选择,然后重新选择条目,从而刷新 JTable。

由于 Netbeans 生成此代码,我假设第二个 JTable 无法使用 Bean Binding 自动更新,并且必须清除 JList 中的选择,然后重新选择条目。

于 2010-08-10T12:06:43.417 回答