我是一个使用java和jsf和hibernate的newbe,我一直在使用jboss forge为我的实体生成crud函数,但我不知道如何使用hibernate @embedable id,这是我的代码 .

@Entity
    @Table(name = "estado", schema = "public")
    public class Estado implements java.io.Serializable
    {

       private EstadoId id;
       private Pais pais;
       private Date fechaRegistro;
       private String descripcion;
       private short estatus;
       private Set municipios = new HashSet(0);

       public Estado()
       {
       }

       public Estado(EstadoId id, Pais pais, Date fechaRegistro, short estatus)
       {
          this.id = id;
          this.pais = 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 = pais;
          this.fechaRegistro = fechaRegistro;
          this.descripcion = 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, length = 5)) })       

    }

接下来是可嵌入的id

@Embeddable
    public class EstadoId  implements java.io.Serializable {


         private String paisId;
         private String estadoId;

        public EstadoId() {
        }

        public EstadoId(String paisId, String estadoId) {
           this.paisId = paisId;
           this.estadoId = estadoId;
        }                    

    }

现在是@ConversationScoped bean

import javax.annotation.Resource;
    import 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;
    import javax.faces.context.FacesContext;
    import javax.faces.convert.Converter;
    import javax.inject.Inject;
    import javax.inject.Named;    

    @Named
    @Stateful
    @ConversationScoped
    public class EstadoBean implements Serializable
    {

       private static final long serialVersionUID = 1L;

       /*
        * Support creating and retrieving Estado entities
        */

       private Long id;

       public Long getId()
       {
          return this.id;
       }

       public void setId(Long id)
       {
          this.id = id;
       }

       private Estado estado;

       public Estado getEstado()
       {
          return this.estado;
       }

       @Inject
       private Conversation conversation;

       @PersistenceContext(type = PersistenceContextType.TRANSACTION)
       private EntityManager entityManager;

       public String create()
       {

          this.conversation.begin();
          return "create?faces-redirect=true";
       }

       public void retrieve()
       {

          if (FacesContext.getCurrentInstance().isPostback())
          {
             return;
          }

          if (this.conversation.isTransient())
          {
             this.conversation.begin();
          }

          if (this.id == null)
          {
             this.estado = this.example;
          }
          else
          {
             this.estado = findById(getId());
          }
       }

       public Estado findById(Long id)
       {

          return this.entityManager.find(Estado.class, id);
       }


       @Resource
       private SessionContext sessionContext;

       public Converter getConverter()
       {

          final EstadoBean ejbProxy = this.sessionContext.getBusinessObject(EstadoBean.class);

          return new Converter()
          {

             @Override
             public Object getAsObject(FacesContext context, UIComponent component, String value)
             {

                return ejbProxy.findById(Long.valueOf(value));
             }

             @Override
             public String getAsString(FacesContext context, UIComponent component, Object value)
             {

                if (value == null)
                {
                   return "";
                }

                return String.valueOf(((Estado) value).getId());
             }
          };
       }

    }

事实上,我真正怀疑的是如何正确编码getConverter方法,因为estado实体id不是字符串值,estado实体的id类型是由两个字符串值组成的estadoId可嵌入类型,我有的另一个问题是从哪里来getConverter方法获取String值param?