私はJavaとjsfと休止状態の新人で、エンティティのcrud関数を生成するためにjboss forgeを使用していますが、休止状態の@embedable idで動作させる方法がわかりません。これが私のコードです。
@実在物 @Table(名前 = "エスタド"、スキーマ = "パブリック") public クラス Estado は java.io.Serializable を実装します { プライベート EstadoId id; プライベート パイス パイス; プライベート日付 fechaRegistro; プライベート文字列の説明。 私的略称; プライベート セット municipios = 新しい HashSet(0); public Estado() { } public Estado(EstadoId id, Pais pais, Date fechaRegistro, short estatus) { this.id = id; this.pais = パイス; this.fechaRegistro = fechaRegistro; this.estatus = estatus; } public Estado(EstadoId id, Pais pais, Date fechaRegistro, String descripcion, short estatus, Set municipios) { this.id = id; this.pais = パイス; this.fechaRegistro = fechaRegistro; this.descripcion = 説明; this.estatus = estatus; this.municipios = municipios; } @EmbeddedId @AttributeOverrides( { @AttributeOverride(name = "paisId", column = @Column(name = "pais_id", nullable = false, length = 5)), @AttributeOverride(name = "estadoId", column = @Column(name = "estado_id"、nullable = false、長さ = 5)) }) }
次に埋め込み可能な ID
@埋め込み可能 public class EstadoId は java.io.Serializable を実装します { プライベート文字列 paisId; プライベート文字列 estadoId; public EstadoId() { } public EstadoId(String paisId, String estadoId) { this.paisId = paisId; this.estadoId = estadoId; } }
今 @ConversationScoped Bean
import javax.annotation.Resource; javax.ejb.SessionContext をインポートします。 import javax.ejb.Stateful; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; javax.faces.context.FacesContext をインポートします。 import javax.faces.convert.Converter; import javax.inject.Inject; import javax.inject.Named; @名前付き @ステートフル @ConversationScoped public class EstadoBean は Serializable を実装します { private static final long serialVersionUID = 1L; /* * Estado エンティティの作成と取得をサポート */ プライベート ロング ID。 public Long getId() { this.id を返します。 } public void setId(ロング ID) { this.id = id; } プライベート エスタド エスタド; public Estado getEstado() { this.estado を返します。 } @注入 プライベートな会話; @PersistenceContext(type = PersistenceContextType.TRANSACTION) プライベート EntityManager entityManager; パブリック文字列 create() { this.conversation.begin(); return "create?faces-redirect=true"; } public void retrieve() { if (FacesContext.getCurrentInstance().isPostback()) { 戻る; } if (this.conversation.isTransient()) { this.conversation.begin(); } if (this.id == null) { this.estado = this.example; } そうしないと { this.estado = findById(getId()); } } public Estado findById(Long id) { return this.entityManager.find(Estado.class, id); } @リソース プライベート SessionContext sessionContext; public コンバーター getConverter() { final EstadoBean ejbProxy = this.sessionContext.getBusinessObject(EstadoBean.class); 新しいコンバーターを返す() { @オーバーライド public Object getAsObject(FacesContext コンテキスト、UIComponent コンポーネント、文字列値) { return ejbProxy.findById(Long.valueOf(value)); } @オーバーライド public String getAsString (FacesContext コンテキスト、UIComponent コンポーネント、オブジェクト値) { if (値 == null) { 戻る ""; } return String.valueOf(((Estado) value).getId()); } }; } }
実際、私の本当の疑問は、getConverter メソッドを適切にコーディングする方法についてです。なぜなら、estado エンティティ ID は文字列値ではなく、estado エンティティの ID タイプは、2 つの文字列値で構成される estadoId 埋め込み可能タイプだからです。 getConverter メソッドは、文字列値 param ? を取得します。