VRaptor3 + Hibernate + Relacionamento @OneToMany

8 respostas
gabrielmassote

E ae Pessoal?

Estou começando com o hibernate e com o vraptor e estou com uma dificuldade em armazenar os dados utilizando o relacionamento @OneToMany.

Minha classe Projeto:

@Entity
public class Project {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy="project")
    private Set<User> users;

    //...
}

Minha classe Usuário:

@Entity
public class User {

    @Id
    private String login;
    private String name;
    private String password;
    private String role;
    
    @ManyToOne
    @JoinColumn(name="project_fk")
    private Project project;

    //...

E o que gostaria de fazer é que um projeto tivesse vários usuários. Só que não estou conseguindo fazer isso no meu controller para que apareca o projeto específico na chave estrangeira da minha tabela referente ao Bean Usuário.

Alguma dica?
Grato pessoal.

8 Respostas

Guevara

E ai gabrielmassote!
Veja se a sua dúvida é a mesma que a minha.
http://www.guj.com.br/posts/list/204789.java
Meu problema tb é persistir os dados.
Abraço!

gabrielmassote

E aee…
Creio que seja sim!

Eu tenho o projeto e a chave estrangeira no usuário está nula. Não consigo cadastrar o projeto em que os usuários estão envolvidos.
Gostaria de criar um projeto e na página onde eu vejo os dados do projeto (está funcionando). Gostaria de adicionar usuários a este projeto.

Vamos esperar a contribuição do pessoal.

[]'s

Guevara

Pois é, me disseram que deveria instanciar a outra classe tb, eu fiz isso, mas na classe Mensagem fica com a chave estrangeira nula, o mesmo problema que o seu. Revirei td quanto é fórum e não achei um exemplo de form para persistir esse tipo de relacionamento, por exempo, na minha classe Contato não existe atributo assunto e mensagem, pois eles estão na classe Mensagem, e se colocar no form contato.mensagem.assunto a stacktrace mostra que o parâmetro não é encontrado, já que Contato não possui atrinuto “mensagem”. A menos que além da anotação com JPA precise criar código na classe Contato para que esta devolva assunto e mensagem, o que eu acho que não deve ser.

Responderam lá no meu tópico, vou testar aqui. Confere lá vc tb. \o/
http://www.guj.com.br/posts/list/204789.java

Lucas_Cavalcanti

@OneToMany com mappedBy cria um relacionamento fraco… não adianta só adicionar um usuário nessa lista que não vai adiantar… vc precisa no usuário setar o projeto, daí funciona…

ou seja, ao invés de fazer

projeto.getUsuarios().add(usuario);

faça

usuario.setProjeto(projeto);
Lavieri

Uma forma de resolver a parada é:

@Entity @EntityListener(ProjectListener.class) public class Project { //... aqui mantenha sua classe como é }

e crie o listener asssim

public class ProjectListener { @PrePersist @PreUpdate public void antesDeSalvar(Project project) { Collection<User> users = project.getUsers(); if (users != null) { for(User user : users) user.setProject(project); } } }

assim seu problema resolve

caarlos0

não conheço essas anotações:

@PrePersist  
@PreUpdate

explica? :roll:

gabrielmassote

Tudo bem Lucas?

E se eu fizer um JOIN entre as tabelas me gerando uma tabela com chaves estrangeiras? Qual seria o mais recomendado?
Vi na documentação do hibernate que utilizando apenas o @OneToMany na classe Project ele criaria um JOIN entre Project e User.

Testei isto antes de dormir só que ainda não tentei popular. Seria de uma forma diferente?

@Entity
public class Project {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @OneToMany
    private Set<User> developers;
    
    //...
}
Lucas_Cavalcanti

qdo vc coloca o @OneToMany ou @ManyToOne (e outras desse tipo) o hibernate vai fazer o join pra você automaticamente quando vc buscar a entidade do banco de dados… só anotando os relacionamentos com isso o hibernate já se vira pra criar a coluna (ou tabela) de relacionamento, vc não precisa se preocupar

Criado 26 de abril de 2010
Ultima resposta 27 de abr. de 2010
Respostas 8
Participantes 5