我正在尝试使用 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);
}
任何帮助将不胜感激!如果您需要更多信息,请与我们联系。
问候, 亨里克