Play で問題が発生しています。2 つのリスト (世帯内の人のリストと銀行口座のリスト) を含むオブジェクト (町内会のメンバー) を編集する形式。奇妙なことに、銀行口座の textInputs がフォームで空であるのに、人物のリストがフォームで適切に表示されます。ただし、銀行口座の数は正しいです。
フィールドの内容を表示するために、編集フォーム テンプレートにいくつかのデバッグ ステートメントを追加しました。個人のリストに関連するフィールドについては、
BeanList size[2] hasMoreRows[false] list[models.Persoon@1, models.Persoon@2]
一方、銀行口座のリストは表示されます
BeanList deferred
問題を切り分けるためにアプリを可能な限り削減し、git://github.com/janpascal/ledenadmin.git
ブランチの Github() にコードをプッシュしましたdebug-form
。両方のリストがまったく同じように作成および処理されているようですが、どういうわけか異なって表示されます。この関係は Cascade-ALL です。save()
Person オブジェクトまたは Bankrekening オブジェクトを作成するときにand呼び出しを追加しようとしたことを確認するためupdate()
ですが、違いはありません。
どんな助けでも大歓迎です!
フォーム:
@(id: Long, myForm: Form[Lid])
@main("Bewerk lid") {
<h1>Bewerk lid</h1>
@myForm
<br>
@myForm.value()
<br>
@myForm.field("personen").value()
<br>
@myForm.field("rekeningnummers").value()
<br>
@helper.form(action = routes.Leden.saveLid(id)) {
<fieldset>
<legend>Lid @id</legend>
@helper.repeat(myForm("personen"), min = 1) { persoonField =>
@helper.inputText(persoonField("name"), '_label -> "Naam" )
}
@helper.inputText(myForm("address"), '_label -> "Adres")
@helper.repeat(myForm("rekeningnummers"), min = 1) { rekeningField =>
@helper.inputText(rekeningField("rekeningnummer"))
}
</fieldset>
<input type="submit" value="Opslaan">
}
}
私のモデル:
@Entity
public class Lid extends Model {
@GeneratedValue(strategy=GenerationType.AUTO, generator="lid_seq_gen")
@SequenceGenerator(name="lid_seq_gen", sequenceName="LID_SEQ")
@Id
public Long id;
@OneToMany(cascade=CascadeType.ALL, mappedBy="lid")
public List<Persoon> personen;
public String address;
@OneToMany(cascade=CascadeType.ALL, mappedBy="lid")
public List<Bankrekening> rekeningnummers;
public Lid(Long id, String name, String address, String bankaccount) {
this.id = id;
this.personen = new ArrayList<Persoon>();
this.personen.add(new Persoon(this, name));
this.rekeningnummers = new ArrayList<Bankrekening>();
this.rekeningnummers.add(new Bankrekening(this,bankaccount));
this.address = address;
}
public String toString() {
return "Lid "+id+" ("+getFirstName()+")";
}
public String getFirstName() {
if(personen.size()>=1) return personen.get(0).name;
return "";
}
public Bankrekening addRekening(String rekeningnummer) {
Bankrekening rek = new Bankrekening(this, rekeningnummer);
rekeningnummers.add(rek);
return rek;
}
public static void create(Lid lid) {
lid.save();
}
public static void delete(Long id) {
find.ref(id).delete();
}
public static Finder<Long,Lid> find = new Finder<Long, Lid>(
Long.class, Lid.class
);
}
@Entity
public class Persoon extends Model {
@GeneratedValue(strategy=GenerationType.AUTO, generator="persoon_seq_gen")
@SequenceGenerator(name="persoon_seq_gen", sequenceName="PERSOON_SEQ")
@Id
public Long id;
@ManyToOne
public Lid lid;
@Constraints.Required
public String name;
public Persoon(Lid lid, String name) {
this.lid = lid;
this.name = name;
}
public static void create(Persoon p) {
p.save();
}
public static void delete(Long id) {
find.ref(id).delete();
}
public static Finder<Long,Persoon> find = new Finder<Long, Persoon>(
Long.class, Persoon.class
);
}
@Entity
public class Bankrekening extends Model {
@GeneratedValue(strategy=GenerationType.AUTO, generator="bankrek_seq_gen")
@SequenceGenerator(name="bankrek_seq_gen", sequenceName="BANKREKENING_SEQ")
@Id
public Long id;
@ManyToOne
public Lid lid;
@Constraints.Required
public String rekeningnummer;
public Bankrekening(Lid lid, String nummer) {
this.lid = lid;
this.rekeningnummer = nummer;
}
public static void create(Bankrekening bankrekening) {
bankrekening.save();
}
public static void delete(Long id) {
find.ref(id).delete();
}
public static Finder<Long,Bankrekening> find = new Finder<Long, Bankrekening>(
Long.class, Bankrekening.class
);
}
コントローラー:
public class Leden extends Controller {
public static Result lijst() {
List<Lid> leden = Lid.find.all();
return ok(ledenlijst.render(leden));
}
public static Result bewerkLid(Long id) {
Form<Lid> myForm = form(Lid.class).fill(Lid.find.byId(id));
Lid lid = Lid.find.byId(id);
System.out.println("Editing "+lid.toString());
System.out.print("Bankrekeningen:");
for(Bankrekening rek: lid.rekeningnummers) {
System.out.print(" "+rek.rekeningnummer);
}
System.out.println();
System.out.println("Form information:");
System.out.println(myForm.value());
System.out.println(myForm);
System.out.println(myForm.data());
return ok(editlid.render(id, myForm));
}
public static Result saveLid(Long id) {
Form<Lid> form = form(Lid.class).bindFromRequest();
if(form.hasErrors()) {
return badRequest(editlid.render(id,form));
}
form.get().update(id);
System.out.println("Form information:");
System.out.println(form.value());
System.out.println(form);
System.out.println(form.data());
Lid lid = form.get();
System.out.println("Updating"+lid.toString());
System.out.print(" Bankrekeningen:");
for(Bankrekening rek: lid.rekeningnummers) {
System.out.print(" "+rek.rekeningnummer);
}
return lijst();
}
}
最後に、データベースをシードする Global オブジェクト:
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
InitialData.insert(app);
}
static class InitialData {
public static void insert(Application app) {
if(Ebean.find(Lid.class).findRowCount() == 0) {
System.out.println("Seeding members");
for(long i=1; i<10; i++) {
Lid lid = new Lid(i, "lid"+i, "Kerkstraat "+i, "Bank account"+i);
//lid.addRekening(new Long(i*5462).toString());
Lid.create(lid);
}
}
}
}
}