私は自分の問題に対する良い習慣ときれいな解決策を探しています。2つのエンティティクラスがあります。
@Entity
public class Site implements Serializable {
...
@OneToMany(mappedBy = "site")
private List<SiteIp> siteIpList;
...
public List<SiteIp> getSiteIpList() {
return siteIpList;
}
public void setSiteIpList(List<SiteIp> siteIpList) {
this.siteIpList = siteIpList;
}
}
@Entity
@IdClass(SiteIpPK.class)
public class SiteIp implements Serializable {
@Id
@ManyToOne(fetch = FetchType.LAZY)
private Site site;
@Id
private int idx;
private String ip;
/* other stuff such as constructors, getters and setters */
}
SiteIpPKには2つの列があり、クリーンである必要があります:)明らかに、これは世界で一般的に使用されているモデルです。
次に、ビューレイヤーがあります。JSFページには、特定のサイトとidxのSiteIp.ipを示す3つのフィールドがあります。これまでのところ、サイトエンティティでヘルパーゲッターメソッドを作成しました。
public String getIpForIdx(Integer idx) {
// there's no simple siteIpList.get(idx), because of additional logic in getter
// so let's iterate through entire list
for (SiteIp siteIp : this.siteIpList) {
if (/* other logic returns true value && */ siteIp.getIdx() == idx) {
return siteIp.getIp();
}
}
return null;
}
JSF式言語は次のように構成されています。
<h:inputText id="sync1_ip" value="#{siteController.editContext.site.getIpForIdx(1)}" />
これで、ページにアクセスすると、適切なIP値が入力テキストフィールドに伝播されます。ただし、IPが変更されてフォームが送信されると、ELは例外をスローします。
javax.el.PropertyNotWritableException: /edit/siteEdit.xhtml @47,123 value="#{siteController.editContext.site.getIpForIdx(1)}": Illegal Syntax for Set Operation
私はそれを理解し、認めているので、私の質問があります:
この問題を処理するためのベストプラクティスは何ですか?ややひどい解決策は、一意のインデックスが存在するのと同じ数のヘルパーメソッドを作成することです。
public String getIp1() {
return this.IpForIdx(1);
}
public String getIp2() {
return this.IpForIdx(2);
}
/* ... */
public void setIp1(String newIp) {
this.siteIpList.add(1, newIp);
}
public void setIp2(String newIp) {
this.siteIpList.add(2, newIp);
}
/* ... and so on... */
JSF ELの場合:
<h:inputText id="sync1_ip" value="#{siteController.editContext.site.ip1}" />
他に、より柔軟で美しいソリューションはありますか?