[Resolvido] Insert Cascade! Quebrando a cabeça!

3 respostas
R

Galera, boa noite!

Estou com a cabeça quente já e não consigo resolver essa bronca.

Tenho um mapeamento onde existe um movimento de cardapio que está ligado ao item e ao naoItem (vou dealhar melhor)

um movCardapio pode ter n itens
um movCardapio pode ter n nãoItens (não item é o que você quer remover da sua refeicao)

Quando faço o insert via hibernate, ele até faz todo mapeamento da forma correta, porém, os filhos ficam sem o código do pai e como é uma FK, da problema.

Exemplo:

@Entity
@Table(name="mov_cardapio")
public class MovCardapioDTO {

	@SequenceGenerator(name = "Seq", sequenceName = "SEQ_MOV_CARDAPIO", allocationSize = 1)
	@GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = "Seq")

	@Id
	@Column(name="cd_mov_cardapio")
	private Long cdMovCardapio;

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "cd_mov_cardapio")
	private List<ItMovCardapioDTO> itMovCardapio;
	
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "cd_mov_cardapio")
	private List<ItMovCardExclusaoDTO> itMovCardExclusao;

get... set..
}


@Entity
@Table(name = "itmov_cardapio")
public class ItMovCardapioDTO {

	@SequenceGenerator(name = "Seq", sequenceName = "SEQ_ITMOV_CARDAPIO", allocationSize = 1)
	@GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = "Seq")

	@Id
	@Column(name = "cd_itmov_cardapio")
	private Long cdItMovCardapio;

	@ManyToOne
	@JoinColumn(name = "cd_mov_cardapio")
	private MovCardapioDTO cdMovCardapio;
}

@Entity
@Table(name = "itmov_card_exclusao")
public class ItMovCardExclusaoDTO {

	@SequenceGenerator(name = "Seq", sequenceName = "SEQ_ITMOV_CARDAPIO_EXCL", allocationSize = 1)
	@GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = "Seq")

	@Id
	@Column(name = "cd_itmov_card_excl")
	private Long cdItMovCardExcl;

	@ManyToOne
	@JoinColumn(name = "cd_mov_cardapio")
	private MovCardapioDTO cdMovCardapio;
}

Sempre que tento salvar a informação, me ocorre esse erro

Hibernate: select SEQ_MOV_CARDAPIO.nextval from dual
Hibernate: select SEQ_ITMOV_CARDAPIO_EXCL.nextval from dual
Hibernate: select SEQ_ITMOV_CARDAPIO.nextval from dual
Hibernate: insert into mov_cardapio (cd_atendimento, cd_setor, cd_usuario, ds_diagnostico, dt_mov_cardapio, obs_nutricao, cd_unid_int, cd_mov_cardapio) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into itmov_card_exclusao (cd_mov_cardapio, tp_itmov_cardapio, cd_itmov_card_excl) values (?, ?, ?)
 WARN [main] (JDBCExceptionReporter.java:100) - SQL Error: 1400, SQLState: 23000
ERROR [main] (JDBCExceptionReporter.java:101) - ORA-01400: cannot insert NULL into ("ITMOV_CARD_EXCLUSAO"."CD_MOV_CARDAPIO")

Alguém tem alguma luz? já tentei com @MappedBy e outras opções porém não consigo sair deste ponto!

3 Respostas

R

RodrigoValentim:
Galera, boa noite!

Estou com a cabeça quente já e não consigo resolver essa bronca.

Tenho um mapeamento onde existe um movimento de cardapio que está ligado ao item e ao naoItem (vou dealhar melhor)

um movCardapio pode ter n itens
um movCardapio pode ter n nãoItens (não item é o que você quer remover da sua refeicao)

Quando faço o insert via hibernate, ele até faz todo mapeamento da forma correta, porém, os filhos ficam sem o código do pai e como é uma FK, da problema.

Exemplo:

@Entity
@Table(name="mov_cardapio")
public class MovCardapioDTO {

	@SequenceGenerator(name = "Seq", sequenceName = "SEQ_MOV_CARDAPIO", allocationSize = 1)
	@GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = "Seq")

	@Id
	@Column(name="cd_mov_cardapio")
	private Long cdMovCardapio;

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "cd_mov_cardapio")
	private List<ItMovCardapioDTO> itMovCardapio;
	
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "cd_mov_cardapio")
	private List<ItMovCardExclusaoDTO> itMovCardExclusao;

get... set..
}


@Entity
@Table(name = "itmov_cardapio")
public class ItMovCardapioDTO {

	@SequenceGenerator(name = "Seq", sequenceName = "SEQ_ITMOV_CARDAPIO", allocationSize = 1)
	@GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = "Seq")

	@Id
	@Column(name = "cd_itmov_cardapio")
	private Long cdItMovCardapio;

	@ManyToOne
	@JoinColumn(name = "cd_mov_cardapio")
	private MovCardapioDTO cdMovCardapio;
}

@Entity
@Table(name = "itmov_card_exclusao")
public class ItMovCardExclusaoDTO {

	@SequenceGenerator(name = "Seq", sequenceName = "SEQ_ITMOV_CARDAPIO_EXCL", allocationSize = 1)
	@GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator = "Seq")

	@Id
	@Column(name = "cd_itmov_card_excl")
	private Long cdItMovCardExcl;

	@ManyToOne
	@JoinColumn(name = "cd_mov_cardapio")
	private MovCardapioDTO cdMovCardapio;
}

Sempre que tento salvar a informação, me ocorre esse erro

Hibernate: select SEQ_MOV_CARDAPIO.nextval from dual
Hibernate: select SEQ_ITMOV_CARDAPIO_EXCL.nextval from dual
Hibernate: select SEQ_ITMOV_CARDAPIO.nextval from dual
Hibernate: insert into mov_cardapio (cd_atendimento, cd_setor, cd_usuario, ds_diagnostico, dt_mov_cardapio, obs_nutricao, cd_unid_int, cd_mov_cardapio) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into itmov_card_exclusao (cd_mov_cardapio, tp_itmov_cardapio, cd_itmov_card_excl) values (?, ?, ?)
 WARN [main] (JDBCExceptionReporter.java:100) - SQL Error: 1400, SQLState: 23000
ERROR [main] (JDBCExceptionReporter.java:101) - ORA-01400: cannot insert NULL into ("ITMOV_CARD_EXCLUSAO"."CD_MOV_CARDAPIO")

Alguém tem alguma luz? já tentei com @MappedBy e outras opções porém não consigo sair deste ponto!

Bom, lendo algumas documentações e posts aqui do forum, encontrei uma solução (so não sei se é a correta!)

no caso da minha classe pai está setando os filhos, eu seto neste momento minha classe pai também.

public void setItMovCardapio(List<ItMovCardapioDTO> itMovCardapio) {
		this.itMovCardapio = itMovCardapio;
        for(ItMovCardapioDTO m: itMovCardapio)    
            m.setMovcardapio(this);  
	}

Problema resolvido!

Desta forma, quando for setar meu ID pra classe movCardapio, o filho também pegará esta informação!

Resultado

movCardapioDAO.merge(movCardapioDTO);

Hibernate: select SEQ_MOV_CARDAPIO.nextval from dual
Hibernate: select SEQ_ITMOV_CARDAPIO_EXCL.nextval from dual
Hibernate: select SEQ_ITMOV_CARDAPIO.nextval from dual
Hibernate: insert into mov_cardapio (cd_atendimento, cd_setor, cd_usuario, ds_diagnostico, dt_mov_cardapio, obs_nutricao, cd_unid_int, cd_mov_cardapio) values (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into itmov_card_exclusao (cd_mov_cardapio, cd_opcao, tp_itmov_cardapio, cd_itmov_card_excl) values (?, ?, ?, ?)
Hibernate: insert into itmov_cardapio (ds_opcao, cd_mov_cardapio, qt_cardapio, tp_itmov_cardapio, cd_itmov_cardapio) values (?, ?, ?, ?, ?)
R

Bom, muito estranho o que está ocorrendo comigo!

Quando salvo usando o Flex, o hibernate faz uma consulta desconhecida por mim!

Hibernate: select movcardapi0_.cd_mov_cardapio as cd1_31_1_, movcardapi0_.cd_atendimento as cd7_31_1_, movcardapi0_.cd_setor as cd2_31_1_, movcardapi0_.cd_usuario as cd3_31_1_, movcardapi0_.ds_diagnostico as ds4_31_1_, movcardapi0_.dt_mov_cardapio as dt5_31_1_, movcardapi0_.obs_nutricao as obs6_31_1_, movcardapi0_.cd_unid_int as cd8_31_1_, itmovcarde1_.cd_mov_cardapio as cd3_3_, itmovcarde1_.cd_itmov_card_excl as cd1_3_, itmovcarde1_.cd_itmov_card_excl as cd1_32_0_, itmovcarde1_.cd_mov_cardapio as cd3_32_0_, itmovcarde1_.cd_opcao as cd4_32_0_, itmovcarde1_.tp_itmov_cardapio as tp2_32_0_ from dbahsr.mov_cardapio movcardapi0_ left outer join dbahsr.itmov_card_exclusao itmovcarde1_ on movcardapi0_.cd_mov_cardapio=itmovcarde1_.cd_mov_cardapio where movcardapi0_.cd_mov_cardapio=?
Hibernate: select dbahsr.SEQ_MOV_CARDAPIO.nextval from dual

essa deve existir por causa do merge, porém, o que me deixa mais intrigado é que existem duas colunas iguais e é justamente por causa dessa coluna que está ocorrendo um erro

javax.persistence.PersistenceException : org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.hsr.dto.ItMovCardExclusaoDTO.cdItMovCardExcl

meus DTO’s não foram alterados… Sinistro… alguém tem ideia do que pode ser?

Quando salvo usando um metodo Main no meu java, o erro não ocorre e o insert é feito 100% correto!!! oO

R

Resolvido! era erro no mapeamento dos objetos!

Criado 26 de maio de 2011
Ultima resposta 27 de mai. de 2011
Respostas 3
Participantes 1