Vraptor , mapeamento Many to Many [RESOLVIDO]

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&aacute;rio [novo]</title>
</head>
<body>
	<fieldset style="width: 390px;">
		<legend>Usu&aacute;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 !!

ok…rsrs

precisando tamo ai.

flw cara