[CascadeType.Persist] Não está funcionando =/

4 respostas
InsaneChess

Prezados,
O Objeto Profissão TEM UM objeto Usuário.
A idéia é Inserir uma “Profissão” ao banco, e ao mesmo tempo inserir seu objeto Usuário por Cascade. Deu para entender?

Quando utilizo o CascadeType.ALL, ele insere a Profissão e seu respectivo Usuário normalmente.
Porém quando utilizo CascadeType.Persist não insere o usuário, inserindo somente a Profissão =/

Quando inserir meu objeto pai “Profissão”, ele não deveria também inserir o filho com o CascadeType.Persist?
A pergunta então é: “Por quê o Hibernate está somente inserindo a Profissão e não o usuário no Banco?”

Segue abaixo o código resumido somente com o necesário.

Profissao profissao = new Profissao();
		profissao.setIdentificador(2);
		profissao.setNomeProfissao("Contador");
		profissao.setSalarioProfissao(5000.00);
		
		Usuario usuario = new Usuario();
		usuario.setIdentificador(3);
		usuario.setNomeUsuario("Everaldo");
		usuario.setIdadeUsuario(40);
		
		profissao.setUsuarioProfissao(usuario);
		
		session.save(profissao);
		transaction.commit();
@Entity
@Table(name = "jobs")
public class Profissao implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5659098257378287517L;

	@Id
	@Column(name = "id")
	Integer identificador;

	@Column(name = "name")
	String nomeProfissao;
	@Column(name = "salary")
	Double salarioProfissao;

	@OneToOne(cascade=CascadeType.PERSIST)
	@JoinColumn(name = "user_id")
	Usuario usuarioProfissao;
@Entity
@Table(name="users")
public class Usuario implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2942017673557453045L;

	@Id
	@Column(name="id")
	private Integer identificador;
	
	@Column(name="name")
	private String nomeUsuario;
	
	@Column(name="age")
	private Integer idadeUsuario;
static public Session getSession(){
		
		SessionFactory sessionFactory = new AnnotationConfiguration().
				setProperty("hibernate.dialect", "org.hibernate.dialect.OracleDialect").
				setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver").
				setProperty("hibernate.connection.url", "jdbc:oracle:thin:@localhost:1521:XE").
				setProperty("hibernate.connection.user", "HibernateMastery").
				setProperty("hibernate.connection.password", "dbzgtaf").
				addAnnotatedClass(com.diogo.orm.Usuario.class).
				addAnnotatedClass(com.diogo.orm.Profissao.class).
				buildSessionFactory();
		
		return sessionFactory.openSession();
	}

4 Respostas

Hebert_Coelho

Cara, saco nada de hibernate puro, mas sei que ele tem um cascade proprio que é utilizado com save_update.

Tenta esse cara.

InsaneChess

O Cascade abaixo é do próprio javax.persistence, não tem essa opção que você falou, isso é quando se usa hibernate.org em uma anotação a parte.
O de baixo deveria funcionar exatamente do mesmo modo desse aí.

Hebert_Coelho

InsaneChess:
O Cascade abaixo é do próprio javax.persistence, não tem essa opção que você falou, isso é quando se usa hibernate.org em uma anotação a parte.
O de baixo deveria funcionar exatamente do mesmo modo desse aí.

Concordaria em 100% com você caso você estivesse utilizando o EntityManager para salvar suas classes. Realmente o SAVE_UPDATE você não vai encontrar nessa anotação aí. A anotação aí que eu disse ela é específica do Hibernate.[=

Você deve saber que cada implementação do JPA (Hibernate, OpenJPA, EclipseLink…) tem a liberdade de adotar comportamentos diferentes.

Bem vou deixar então que alguém que saque de Hibernate te ajudar, boa sorte aí.

InsaneChess

Ok, muito obrigado pela atenção e explicação.
Eu até posso trocar pela Anotação que você sugeriu, porém gostaria somente entender por quê desse modo que fiz não funciona…

Vamos ver se alguém consegue vir aqui me dar um motivo plausível de por quê o CascadeType.PERSIST não está funcionando =/

Criado 9 de julho de 2012
Ultima resposta 10 de jul. de 2012
Respostas 4
Participantes 2