我是一个使用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?