Boa tarde , tenho uma tabela usuario e regra e mais a tabela usuario_regra , já esta mapeado com jpa :
Usuario
@Entity
public class Usuario extends AbstractEntity {
private static final long serialVersionUID = 7649818757373046718L;
private String nome;
private String email;
private String senha;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "usuario_regra",
joinColumns = { @JoinColumn(name = "idusuario", nullable = false,
updatable = false) }, inverseJoinColumns = {
@JoinColumn(name = "idregra", nullable = false, updatable = false) })
private Set<Regra> regras = new HashSet<Regra>(0);
//Geter and Setter
}
Regra
@Entity
public class Regra extends AbstractEntity {
private static final long serialVersionUID = 1L;
private String nome;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "usuario_regra",
joinColumns = { @JoinColumn(name = "idregra", nullable = false,
updatable = false) }, inverseJoinColumns = {
@JoinColumn(name = "idusuario", nullable = false, updatable = false) })
private Set<Usuario> usuarios = new HashSet<Usuario>(0);
//Getter and Setters
}
O metodo salvar do meu UsuarioController esta assim
@Post("/usuario")
public void salvar(Usuario usuario) {
String senha = usuario.getSenha();
senha = EncriptarMD5.encriptar(usuario.getSenha());
usuario.setSenha(senha);
usuario = repository.save(usuario);
result
.include("message", "Usuário salvo com sucesso!")
.redirectTo(this).exibir(usuario);
}
O propio hibernate esta criando as tabelas e as chaves corretamente , mais o problema é que eu não sei oque que tenho que fazer para que ao gravar o usuário gravar a nova regra no usuario_regra , e como mostrar um combo box para selecionar a regra no formulário do usuario. Agradeço a quem puder me ajudar , pois sou muito iniciante tanto em vraptor quanto java !!
cara,
como seu relacionamento manytomany é biderecional, vc vai ter que adicionar o usuario da lista de usuarios no objeto regra e fazer o contrario com a regra.
t+
[quote=alissonvla]cara,
como seu relacionamento manytomany é biderecional, vc vai ter que adicionar o usuario da lista de usuarios no objeto regra e fazer o contrario com a regra.
t+[/quote]
Aonde , no modelo ou no controller ?
cara,
pode fazer o vinculo no seu metodo salvar.
t+
[quote=alissonvla]cara,
pode fazer o vinculo no seu metodo salvar.
t+[/quote]
Desculpe te incomodar , mas ainda não faço ideia como fazer isto , poderia me dar um exemplo ?
cara,
vc vai ter que fazer algo parecido com isso
public void salvar(Usuario usuario) {
String senha = usuario.getSenha();
senha = EncriptarMD5.encriptar(usuario.getSenha());
usuario.setSenha(senha);
Regra regra = new Regra();
regra.setNome("Teste");
regra.setUsuarios(usuario);
usuario.setRegra(regra);
usuario = repository.save(usuario);
result
.include("message", "Usuário salvo com sucesso!")
.redirectTo(this).exibir(usuario);
}
t+
[quote=alissonvla]cara,
vc vai ter que fazer algo parecido com isso
public void salvar(Usuario usuario) {
String senha = usuario.getSenha();
senha = EncriptarMD5.encriptar(usuario.getSenha());
usuario.setSenha(senha);
Regra regra = new Regra();
regra.setNome("Teste");
regra.setUsuarios(usuario);
usuario.setRegra(regra);
usuario = repository.save(usuario);
result
.include("message", "Usuário salvo com sucesso!")
.redirectTo(this).exibir(usuario);
}
t+[/quote]
Não deu certo!Esqueci de dizer que tanto Usuario quanto Regra possuem id , que esta sendo recebido por herança , então a tabela Usuario contem id,nome,email,senha e um private Set regras = new HashSet(0); e a regra tem id,nome e private Set usuarios = new HashSet(0); e a tabela usuario_regra que só existe no mysql tem idregra e idusuario
ok,
mas provavelmente seu id no banco está como auto incremente,
posta o log de erro completo para eu ver o que esta acontecendo
t+
[quote=alissonvla]ok,
mas provavelmente seu id no banco está como auto incremente,
posta o log de erro completo para eu ver o que esta acontecendo
t+[/quote]
Na verdade já da erro no eclipse
no regra.setUsuarios(usuario); The method setUsuarios(Set) in the type Regra is not applicable for the arguments (Usuario)
e no usuario.setRegra(regra); The method setRegra(Regra) is undefined for the type Usuario
Mas pelo que vc me passou , estaria gravando dados direto no objeto Regras né ?Mas não é isso que eu quero , eu quero criar uma referencia a regra na tabela usuario_regra seri isso?
cara,
vc vai ter que fazer algo assim
@Entity
public class Usuario extends AbstractEntity {
private static final long serialVersionUID = 7649818757373046718L;
private String nome;
private String email;
private String senha;
@ManyToMany(mappedBy="usuarios", cascade = CascadeType.ALL)
private Set<Regra> regras = new HashSet<Regra>(0);
//Geter and Setter
}
@Entity
public class Regra extends AbstractEntity {
private static final long serialVersionUID = 1L;
private String nome;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name="usuario_regra",
joinColumns={@JoinColumn(name="idregra")},
inverseJoinColumns={@JoinColumn(name="idusuario")})
private Set<Usuario> usuarios = new HashSet<Usuario>(0);
//Getter and Setters
}
public void salvar(Usuario usuario) {
String senha = usuario.getSenha();
senha = EncriptarMD5.encriptar(usuario.getSenha());
usuario.setSenha(senha);
Regra regra = repository.pesquisarRegra(1);//vc vai ter que fazer uma consulta no seu banco e pegar a regra deacordo com um id.
regra.setUsuarios(usuario);
usuario.setRegras(regra);
usuario = repository.save(usuario);
result
.include("message", "Usuário salvo com sucesso!")
.redirectTo(this).exibir(usuario);
}
Talvez o meu mapeamento esteja errado.Minha intenção é que cada usuário tenha 0 a N regras. Assin no formulario o usuário selecionaria as regras e ao salvar deveria criar uma associação entre usuario e regras inserindo por exemplo na tabela usuario_regras como idregra = 1 idusuario = 1 ,idregra = 2 idusuario = 1 , ideregra = 3 idusuario = 2 …
entendi seu caso,
mesmo assim vc vai ter que fazer um select no banco para pegar cada regra, pois vc vai precisa de objeto persistente.
t+
[quote=alissonvla]entendi seu caso,
mesmo assim vc vai ter que fazer um select no banco para pegar cada regra, pois vc vai precisa de objeto persistente.
t+[/quote]
Ok estou testando , não tinha recebido a sua resposta na hora que perguntei denovo . O repository.pesquisarRegra(1); deve ser no repositorio regras né ?
isso,
cara faz um teste primeiro, para vc ver como vai funcionar o mapeamento, vc pode usar o Junit para isso.
t+
O mais próximo que eu consegui colocar foi
@Post("/usuario")
public void salvar(Usuario usuario , Regra regra) {
String senha = usuario.getSenha();
senha = EncriptarMD5.encriptar(usuario.getSenha());
usuario.setSenha(senha);
//usuario = repository.loadById(usuario.getId());
regra = regraRepository.loadById(regra.getId());
//long usuarios = usuario.getId();
Set<Usuario> usuarios = regra.getUsuarios();
regra.setUsuarios(usuarios);
Set<Regra> regras = usuario.getRegras();
usuario.setRegras(regras ) ;
usuario = repository.save(usuario);
result
.include("message", "Usuário salvo com sucesso!")
.redirectTo(this).exibir(usuario);
}
}
Estou recebendo o regraRepository no construtor
private final UsuarioRepository repository;
private final Result result;
private final RegraRepository regraRepository;
public UsuarioController(Result result, UsuarioRepository repository , RegraRepository regraRepository ) {
this.result = result;
this.repository = repository;
this.regraRepository = regraRepository;
}
E o meu novo.jp esta assim
<head>
<title>Movy | Usuário [novo]</title>
</head>
<body>
<fieldset style="width: 390px;">
<legend>Usuário</legend>
<form action="${pageContext.request.contextPath}/usuario" method="post">
<input type="hidden" name="usuario.id" value="${usuario.id}"/>
<label>Nome:</label>
<input type="text" name="usuario.nome" value="${usuario.nome}"/><br/>
<label>E-mail:</label>
<input type="text" name="usuario.email" value="${usuario.email}"/><br/>
<label>Senha:</label>
<input type="text" name="usuario.senha" value="${usuario.senha}"/><br/>
<label>Regra:</label>
<input type="text" name="usuario.regras" value="${usuario.regras}"/><br/>
<input type="submit" value="salvar"/>
</form>
</fieldset>
</body>
E ao salvar apareçe este erro :
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException
cara,
presta atenção la em cima no exemplo que eu te passei.
vc tem que pegar o objeto regra e vincular a lista que vc tem no seu objeto usuario e fazer o contrario, vincular o usuario a lista que tem no objeto regra.
t+
[quote=alissonvla]cara,
presta atenção la em cima no exemplo que eu te passei.
vc tem que pegar o objeto regra e vincular a lista que vc tem no seu objeto usuario e fazer o contrario, vincular o usuario a lista que tem no objeto regra.
t+[/quote]
Cara eu estou te enchendo eim !! Veja não foi isso que eu fiz aqui não :
Set<Usuario> usuarios = regra.getUsuarios();
Set<Regra> regras = usuario.getRegras();
regra.setUsuarios(usuarios);
usuario.setRegras(regras ) ;
Se eu colocar do geito que vc passou :
regra.setUsuarios(usuario);
usuario.setRegras(regra);
Ele avisa The method setUsuarios(Set) in the type Regra is not applicable for the arguments (Usuario) e The method setRegras(Set) in the type Usuario is not applicable for the arguments (Regra)
é assim
regra.getUsuarios().add(usuario);
usuario.getRegras().add(regra);
[quote=alissonvla]é assim
regra.getUsuarios().add(usuario);
usuario.getRegras().add(regra);
[/quote]
Até que enfim !!! Muito Obrigado !!! Agora so falta um combo box ... Mas vou te dar uma folga e procurar no google.Muito Obrigado !!