Ajuda para mapeamento Hibernate Annotations

5 respostas
ferracin

Salve galera, alguem poderia me ajudar, tenho estas 3 classes: Tarefa, Acoes e Usuario. Um usuario insere uma tarefa no sistema, cada tarefa possui uma lista de acoes que sao realizadas por outros usuarios, como eu mapearia estas classes, eu tento mas sempre da erro, no hibernate eu preciso informar que alguns campos podem ser null? Seria melhor criar mais alguma classe complementar?
Seguem as classes.

Classe TAREFA:

package br.com.gerenciadortarefas.modelo;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import javax.persistence.*;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="tarefas")
public class Tarefa {
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id_tarefa")
	private Long id;
	private String titulo;
	private String descricao;
	private Calendar dataInicio;
	private Boolean finalizada;
	private Calendar dataFinalizacao;
	
	@OneToMany(fetch=FetchType.EAGER, mappedBy="tarefa")
	@Cascade(CascadeType.ALL)
	private Set<Acoes> acoes;

         //Getters & Setters

CLASSSE AÇÃO

package br.com.gerenciadortarefas.modelo;

import java.util.Calendar;

import javax.persistence.*;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
public class Acao {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_acoes")
	private Long id;
	private String descricao;
	private Calendar data;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_tarefa", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Tarefa tarefa;
	
	//duvida nesta parte
	private Usuario usuario;

         //Getters & Setters

CLASSE USUARIO

package br.com.gerenciadortarefas.modelo;

import java.util.List;

import javax.persistence.*;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Table(name="usuarios")
public class Usuario {
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id_usuario")
	private Long id;
	private String login;
	private String senha;
	private String departamento;
	
	@OneToMany(fetch=FetchType.EAGER, mappedBy="acoes")
	@Cascade(CascadeType.ALL)
	private List<Acoes> acoes;

         //Getters & Setters

Muito obrigado pela força!

5 Respostas

Priuli

Por default o hibernate adiciona os campos como nullable = true (pode ser null), se quizer que não permita valores null tem que colocar o campo nullable = false nas anotations de @JoinColumn

Vc precisa mapear a entity Usuario de acordo com a sua regra de relacionamento, assim como vc fez nas outras classes…

@Entity  
public class Acao {  
//...
@ManyToOne()//Uma Ação  pode ter um Usuario
@JoinColumn(name = "id_usuario", nullable=false)  //Exemplo do nullable -> (Este campo não pode ser null)
private Usuario usuario;  
//..gets and sets

Ai se vc quizer relacionar as ações do lado do usuario para obter as listas de ações vc mapea utilizando campo da anotation mappedBy=“usuario” da anotations @OneToMany e não mappedBy=“acoes” como vc colocou… o mappedBy é sempre o nome do campo do outro lado do mapeamento, aquele que está com o id do relacionamento!!!.. :wink:

Obs: Belo time…

ferracin

Agora acho que entendi, estou com um pouco de dificuldades sobre relacionamento de tabelas, mas devagar chego lá, comecei com java há pouco tempo, muito cru ainda.
Mas valew pela força, vou testar aqui e posto os resultados

AGAraujo

O problema é entender projeto de bancos de dados.
Procura o livro do barquinho (Heuser) que vai se ajudar muito.

brunoslsbrito

Tenho uma dúvida também, to mapeando os atributos da minha classe no notificacao.hbm.xml, e lá eu tenho um atibuto Email do tipo Email ( que é uma classe do projeto), mas não to conseguindo fazer esse mapeamento, alguém tem alguma dica? Segue o mapeamento:

Obrigado!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="br.com.fiveit.faro.model.entry">

	<class name="Notificacao" table="tabsac">

		<id name="id" column="idNotificacao" type="java.lang.Integer">
			<generator class="increment">
			</generator>
		</id>
		
		<property name="id" column="id"></property>
		<property name="nome" column="nome"></property>
		<property name="email" column="email"></property>
		<property name="data" column="data"></property>
		<property name="hora" column="hora"></property>
		<property name="tipoNotificacao" column="tipoNotificacao"></property>
		<property name="assunto" column="assunto"></property>
		<property name="mensagem" column="mensagem"></property>
		<property name="nomeProduto" column="nomeProduto"></property>
		<property name="fabricante" column="fabricante"></property>
		<property name="orgaoControle" column="orgaoControle"></property>
	</class>

</hibernate-mapping>
AGAraujo
brunoslsbrito:
Tenho uma dúvida também, to mapeando os atributos da minha classe no notificacao.hbm.xml, e lá eu tenho um atibuto Email do tipo Email ( que é uma classe do projeto), mas não to conseguindo fazer esse mapeamento, alguém tem alguma dica? Segue o mapeamento: Obrigado!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="br.com.fiveit.faro.model.entry">

	<class name="Notificacao" table="tabsac">

		<id name="id" column="idNotificacao" type="java.lang.Integer">
			<generator class="increment">
			</generator>
		</id>
		
		<property name="id" column="id"></property>
		<property name="nome" column="nome"></property>
		<property name="email" column="email"></property>
		<property name="data" column="data"></property>
		<property name="hora" column="hora"></property>
		<property name="tipoNotificacao" column="tipoNotificacao"></property>
		<property name="assunto" column="assunto"></property>
		<property name="mensagem" column="mensagem"></property>
		<property name="nomeProduto" column="nomeProduto"></property>
		<property name="fabricante" column="fabricante"></property>
		<property name="orgaoControle" column="orgaoControle"></property>
	</class>

</hibernate-mapping>

Se email é um atributo de tipo Email() então significa que o Hibernate precisa compreender isto e há algumas maneiras de fazê-lo.
Então antes de saber qual maneira precisa entender seu proprio modelo.
Se por um acaso a class Email é usada apenas para validar e não é uma entidade significativa no modelo ER então você pode mapeá-la como Embedable, que neste caso é o mesmo que mapear uma classes internatemente no hbm.
Se, pelo contrário, a classe Email é uma entidade significativa então deve trabalhar com uma associação correspondente, fazendo junção.

t+

Criado 25 de novembro de 2010
Ultima resposta 16 de mar. de 2011
Respostas 5
Participantes 4