Carregamento vRaptor / data truncation

Fala galera!

Estou aqui enchendo o saco de vocês novamente :slight_smile: afinal, aprender java e fazer as coisas não é tão fácil :B

Galera, tenho minha entity

[code]@Entity
public class Alerta {

@Id @GeneratedValue
private Long id;
private Usuario remetente;
private Usuario destinatario;
private String mensagem;
private String tipo;

    //getters and setters

}[/code]

Possuo também meu form:

<form action="<c:url value="/alerta/novoAmigo"/>" method="post" id="#adicionarAmigo"> <label for="">De: </label> <select name="alerta.remetente.id"> <option value="${usuarioWeb.user.id }">${usuarioWeb.user.nome }</option> </select> <label for="">Usuário: </label> <select name="alerta.destinatario.id"> <option value="${usuario.id }">${usuario.nome }</option> </select> <br/><br/> <label for="mensagem">Diga olá para ${usuario.nome },</label><br/> <textarea rows="5" cols="60" id="mensagem" name="alerta.mensagem"></textarea> <br/> <input type="reset" value="Limpar" class="buttonSubmit" /> <input type="submit" value="Adicionar" class="buttonSubmit" /> </form>

Por fim, meu controller:

[code]@Post @Path("/alerta/novoAmigo")
public void novoAmigo(Alerta alerta) {
alerta.setTipo(“amizade”);
dao.adicionar(alerta);

	result.redirectTo(PerfilController.class).perfilUsuario(alerta.getDestinatario());
}[/code]

Bom, reparei que no meu controller o usuário tanto quanto destinatário ou remetente só vem com a ID preenchida, se eu tentar pegar por exemplo getNome() vai vir null, este problema eu resolvi procurando o usuário pelo único dado que tenho:

alerta.setDestinatario(usuarioDao.procura(alerta.getDestinatario().getId())); alerta.setRemetente(usuarioDao.procura(alerta.getRemetente().getId()));

Primeira dúvida! Eu devo sempre dar um load nele assim? O vRaptor já não faz o load automaticamente, sendo que a id é chave primária?

Bom, mesmo carregando ou não o usuário, sempre da um erro de:

O campo da tabela, está como tinyblob! Como posso resolver isto?

O campo destinatario possui um valor menor do que o valor que você está passando. Aumente o tamanho deste campo.

sugiro que vc dê um drop no database inteiro e deixe o eclipse recriar…

mas antes disso, vc precisa anotar os relacionamentos com @ManyToOne ou @OneToOne.

O vraptor não faz load automaticamente do banco. Na próxima versão vc poderá falar para ele fazer isso, mas não vai ser automático (nem sempre vc quer carregar do banco).

[quote=Lucas Cavalcanti]sugiro que vc dê um drop no database inteiro e deixe o eclipse recriar…

mas antes disso, vc precisa anotar os relacionamentos com @ManyToOne ou @OneToOne.

O vraptor não faz load automaticamente do banco. Na próxima versão vc poderá falar para ele fazer isso, mas não vai ser automático (nem sempre vc quer carregar do banco).[/quote]

Lucas, na mosca!
Bastou dar um drop no banco. Eu havia dado um drop na tabela apenas, já não deveria funcionar? Mas ok!

Lucas, vai ser necessário eu carregar os usuários mesmo? Não posso passar um objeto Usuário, com apenas a id correta?
Pois no banco mesmo, só possui a id certo?

no banco vai ser só o id, mas o hibernate precisa saber que isso é um relacionamento… então anote com @ManyToOne ou @OneToOne (dependendo do tipo de relacionamento que vc estiver usando)

Perfeito, entendi. Última, como consigo passar um parametro sem ser pelo input ou hidden?
Por exemplo,

<select name="alerta.destinatario.id" id="usuario"> <option value="${usuario.id }">${usuario.nome }</option> </select>

Não faz nem sentido por em uma combo apenas uma opção. E se por disabled na combo, não conseguimos pegar o valor.

se vc não quer que o cara mude, use um input com o atributo readonly

tudo bem, mas estarei mostrando do mesmo jeito… acho que a solução vai ser campo hidden mesmo :frowning:
O usuário remetente eu consegui pegar no controller tranquilo, mas este usuario não dá.

mas já está ok assim lucas, muito obrigado! (:

vc pode pegar esse usuário do lado do servidor também…
daí não precisa do input hidden :wink:

como poderia pegar no controller?

O remetente consegui pois o usuarioWeb é sessionscoped e component, aí consegui injetar no construtor :slight_smile:

e como vc pensa em escolher o destinatário?

Basicamente, quando o usuário logado acessa a página do destinatario… “/perfil/destinatario”

Carrega um Usuario que é o destinatario :slight_smile:

Então o remetente é o usuarioWeb logado.
O destinatario é o usuario que está acessível via get do /perfil/destinatario

Passo ele para o alerta através do form mesmo, como [b]alerta.destinatario.id[/b] que possui o valor usuario.id

Deu pra entender né? haha
Por isso fiquei na dúvida, de como passar ele pro alerta se ele não estiver no form. Acho que terei que ficar com a combo ou campo hidden.

não tem como passar pra requisição se não for pelo form (ou pela URL)