Erro em inserção em cascata com Hibernate

0 respostas
alias

Olá amigos do fórum. Por favor, se possível, me ajudem! :frowning: :frowning: :frowning:

Estou com um problema ao tentar persistir entidades no Hibernate. Tenho essa entidade Usuario:

@Entity
@Table(name="Usuario")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="Tipo", discriminatorType=DiscriminatorType.STRING)
public abstract class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public enum TipoUsuario{
		PessoaFisica("PF"), PessoaJuridica("PJ");
		
		private String value;
		
		private TipoUsuario(String value){
			this.value = value;
		}
		public String getValue(){
			return value;
		}
		public static TipoUsuario create(String value){
			if (value.equals("PF"))
				return PessoaFisica;
			else if (value.equals("PJ"))
				return PessoaJuridica;
			else 
				return null;
		}
	}
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="IdUsuario")
	private int id;
	
	@Column(name="Tipo")
	private String tipo;
	
	@Column(name="Senha")
	private String senha;
	
	@Transient
	private String confirmaSenha;
	
	@Column(name="DtCadastro")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dtCadastro;

	@Column(name="Status")
	private int status;
	
	@Column(name="Newsletter")
	private boolean newsletter;
	
	@ManyToMany(fetch=FetchType.LAZY)
	@Cascade(value={CascadeType.PERSIST})
	@JoinTable(name="Usuario_Interesse", 
			   joinColumns={@JoinColumn(name="IdUsuario")}, 
			   inverseJoinColumns={@JoinColumn(name="IdAssunto")})
	private List<AssuntoNewsletter> interesses = new ArrayList<AssuntoNewsletter>();
	
	@OneToMany(fetch=FetchType.LAZY)
	@JoinColumn(name="IdUsuario")
	@Cascade(value={CascadeType.PERSIST})
	private List<UsuarioAcesso> acessos = new ArrayList<UsuarioAcesso>();
	
	@OneToMany(fetch=FetchType.LAZY)
	@JoinColumn(name="IdUsuario")
	@Cascade(value={CascadeType.PERSIST})
	private List<UsuarioEndereco> enderecos = new ArrayList<UsuarioEndereco>();

Reparem que ela tem relacionamentos com as entidades UsuarioAcesso, UsuarioEndereco, e com a tabela associativa Usuario_Interesse.

O código das outras entidades.

@Entity
@Table(name="Usuario_Acesso")
public class UsuarioAcesso implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="IdAcesso")
	private int id;
	
	@ManyToOne
	@JoinColumn(name="IdUsuario")
	private Usuario usuario;
	
	@Column(name="Data")
	@Temporal(value=TemporalType.TIMESTAMP)
	private Date data;
	
	@Column(name="Ip")
	private String ip;
	
	@Column(name="SessionId")
	private String sessionId;
	
	@Column(name="Obs")
	private String obs;
@Entity
@Table(name="Usuario_Endereco")
public class UsuarioEndereco implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public enum TipoEndereco {
		Residencial("RS"), Cobrança("CB"), Comercial("CM");
		
		private String value;
		
		private TipoEndereco(String value){
			this.value = value;
		}
		public String getValue(){
			return value;
		}
		public static TipoEndereco create(String value){
			if (value.equals("RS"))
				return TipoEndereco.Residencial;
			
			else if (value.equals("CB"))
				return TipoEndereco.Cobrança;
			
			else if (value.equals("CM"))
				return TipoEndereco.Comercial;
			
			else
				return null;
			
		}
	}
	
	@Id
	@Column(name="IdEndereco")
	private int id;
	
	@ManyToOne
	@JoinColumn(name="IdUsuario")
	private Usuario usuario;
	
	@Column(name="Tipo")
	private String tipo;
	
	@Column(name="Logradouro")
	private String logradouro;
	
	@Column(name="Numero")
	private String numero;
	
	@Column(name="Compl")
	private String compl;
	
	@Column(name="Bairro")
	private String bairro;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="UF")
	private EstadoFederacao UF;
	
	@Column(name="Cidade")
	private String cidade;
	
	@Column(name="CEP")
	private String CEP;

	@OneToOne(cascade=CascadeType.PERSIST,
			  fetch=FetchType.EAGER)
	@JoinColumn(name="IdEndereco")
	private EnderecoGeo enderecoGeo;

No meu processo, ao persistir o usuario, eu vou ter um UsuarioEndereco e um UsuarioAcesso adicionado nas respectivas coleções, e quero persistir tudo em cascata. E aí…ocorre o malfadado

Acredito que seja algo errado no mapeamento, mas nao entendo o que é…tentei colocar o mappedby tambem, e o Hibernate não fez nada, nem deu erro nem persistiu… não entendo o que está errado, como eu posso persistir o UsuarioEndereco antes se ainda nao tenho o Usuario?

Ajudem amigos, por favor!

Obrigado a todos.

Criado 28 de fevereiro de 2011
Respostas 0
Participantes 1