Alguem ja criou um crud vraptor com chave composta?
poderia compartilhar a view e o controller pra discutir??
essa dúvida não tem muito a ver (eu diria que não tem nada a ver) com VRaptor…
vc precisa aprender como faz isso com o Hibernate, pra usar com o VRaptor não muda nada do normal
deixa eu exemplificar,
para a turma que quer usar o framework e tem um legado de banco pra usar com chaves compostas
no modelo
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
@Table(name="PARAMETRO_SERVICO_DC")
@javax.persistence.Entity
public class Parametroservico implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@EmbeddedId
private ParametroservicoPK id;
@Column(name="DSC_FTP_FILE_PATH_IN")
@NotEmpty(message="validator.notEmpty")
private String dscFtpFilePathIn;
public ParametroservicoPK getId() {
return id;
}
public void setId(ParametroservicoPK id) {
this.id = id;
}
public void setDscftpfilepathin(String dscFtpFilePathIn) {
this.dscFtpFilePathIn = dscFtpFilePathIn;
}
public String getDscftpfilepathin() {
return dscFtpFilePathIn;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
final Parametroservico other = (Parametroservico) obj;
if (getId() != other.getId() && (getId() == null || !getId().equals(other.getId()))) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 17 * hash + (this.getId() != null ? this.getId().hashCode() : 0);
return hash;
}
}
na PK
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import br.com.caelum.vraptor.ioc.Component;
@Component
@Embeddable
public class ParametroservicoPK implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Column(name="EDT_COD")
@NotEmpty(message="validator.notEmpty")
@Length(min= 2, max = 20, message="validator.must.be.between")
private String edtCod;
@Column(name="NOM_PARAMETRO")
@NotEmpty(message="validator.notEmpty")
private String nomParametro;
public void setEdtCod(String edtCod) {
this.edtCod = edtCod;
}
public String getEdtCod() {
return edtCod;
}
public void setNomParametro(String nomParametro) {
this.nomParametro = nomParametro;
}
public String getNomParametro() {
return nomParametro;
}
}
no controler
ex de actions para exibir os dados de uma entidade
@Get("/parametroservicos")
public List<Parametroservico> index() {
return repository.findAll();
}
@Get("/parametroservicos/{parametroservicopk.edtCod}/{parametroservicopk.nomParametro}")
public Parametroservico show(ParametroservicoPK parametroservicopk) {
return repository.find(parametroservicopk);
}
na view
<div class="field">
Codparceironegocio:<br />
<input type="text" name="parametroservico.setId.setEdtCod" value="${parametroservico.getId().getEdtCod()}"/>
</div>
<div class="field">
Nomparametro:<br />
<input type="text" name="parametroservico.setId.setNomParametro" value="${parametroservico.getId().getNomParametro()}"/>
</div>
<div class="field">
Dscftpfilepathin:<br />
<input type="text" name="parametroservico.setDscftpfilepathin" value="${parametroservico.getDscftpfilepathin()}"/>
</div>
[]s a todos
Voce não deve usar o nome dos campos como setId, setXXX, mas sim apenas os nomes das propriedades:
Fala Garcia.
Mais não seria interessante usar os acessores publicos pra isso? afinal poderiamos criar properties artificiais e fica tudo encapsulado
qual a vantagem de usar a propriedade privada direto?
Você não está usando a propriedade privada. Aliás se ela é privada eu não consigo acessar, correto?
O JSTL converte isso para você colocando set quando você quer modificar algo, e get/is quando você lê uma propriedade. objeto.id é apenas uma representação para objeto.getId() e objeto.setId(). Dependendo da operação (leitura ou escrita) o JSTL vai invocar os sets/getters.
O mesmo vale para o Vraptor, que através do OGNL ou IOGI faz o mesmo trabalho.
Ok mais uma coisa me levou a essa implementação
apenas uma duvida isso é case sensitive e o padrão e lcase certo?
acho q deve ter sido por isso q não funcionou quando eu setei apenas as properties (camel case)
é isso mesmo?
Você tem que colocar com o mesmo case da propriedade.
nesse caso não funciona
funciona apenas fazendo lcase
bizzar hum?
é case sensitive e o padrão é a primeira letra minúscula, e o resto normal…
se vc tem um carro.getMotor(), a propriedade tem que ser carro.motor no jsp. Se for carro.getPainelDianteiro(), a propriedade tem que ser carro.painelDianteiro
[quote=gabriel.mancini]nesse caso não funciona
funciona apenas fazendo lcase
bizzar hum?[/quote]
Você tem que colocar exatamente como é o nome das propriedades até chegar onde você quer. Se você tem um objeto chamado foo, tem nele uma propriedade chamada bar, e dentro desse outro objeto tem uma propriedade chamada nomeDoCliente, você deve fazer assim:
foo.bar.nomeDoCliente.
Não tem como errar.