VRaptor+CompositeKey

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.