Mapeamento de HashSet

5 respostas
alexandrenilton

Olha, estou tendo algumas dificuldades em fazer meu mapeamento.
Estou utilizando hibernate 3.6
Eu tenho 2 classes.

Classe 1 eh basicamento composta de:

@Entity
@Table(name = "PESSOA")
public class Pessoa {
    @Id
    @GeneratedValue
    @Column(name = "ID_PESSOA")
    private Long idPessoa;

    @Column(name = "TXT_NOME", length = 255)
    private String txtNome;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Filho> filhos;

    /** getters and setter **/
}

e outra classe:

@Entity
@Table(name = "FILHO")
public class Filho {
    @Id
    @GeneratedValue
    @Column(name = "ID_FILHO")
    private Long idFilho;

    @Column(name = "NOME")
    private String txtNome;

    @ManyToOne
    @JoinColumn(name = "ID_PESSOA")
    private Pessoa pessoa; // Pai ou mae

    /**getters and setters**/
}

O que eu queria: Preencher uma pessoa na mao, inclusive 2 filhos(exemplo), setar os filhos no HashSet, e da um save(pessoa), e ele automaticamente salvar
os dados da pessoa, inclusive os filhos. Segue abaixo os dados das tabelas:

PESSOA

  • ID_PESSOA (int)
  • TXT_NOME (varchar(255))

FILHO

  • ID_FILHO (int)
  • NOME (varchar(255) )
  • ID_PESSOA (int, fazendo FK com PESSOA)

Quem puder me ajudar, ficarei muito grato.

Obrigado…

5 Respostas

Henrique.tenorio

Parece que seu codigo está certo, tenta colocar um @Cascade(CascadeType.ALL)

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @Cascade(CascadeType.ALL) private Set&lt;Filho&gt; filhos;.

Qual é a mensagem de erro que aparece ao executar o codigo?

alexandrenilton

Ola Henrique.tenorio, tentei fazer o que vc me disse, colocar @Cascade(CascadeType.ALL), mas a versão do meu hibernate não consegue achar essa annotation.
Então, segue o erro que está apresentando com o código anterior.

Hibernate: insert into PESSOA (ID_CONJUGE, CPF, DATA_CASAMENTO, ID_ESCOLARIDADE, ID_ESTADO_CIVIL, ORGAO_EMISSOR, RG, TXT_NOM_EMPRESA, TXT_NOM_MAE, TXT_NOM_NACIONALIDADE, TXT_NOM_NATURALIDADE, TXT_NOM_PAI, TXT_NOM_PROFISSAO, TXT_NOME, ID_UF_NACIONALIDADE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into FILHO (ID_PESSOA, SN_EVANGELICO, NOME) values (?, ?, ?)
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not insert: [org.adev.cm.model.entity.Filho]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2327)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2834)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
	at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
	at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:475)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:353)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
	at org.adev.com.model.dao.PessoaDAO.loader(PessoaDAO.java:63)
	at org.adev.cm.control.LoaderController.loader(LoaderController.java:32)
	at org.loader.LoaderDB.loader(LoaderDB.java:13)
	at org.loader.LoaderDB.main(LoaderDB.java:8)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'ID_PESSOA' cannot be null
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
	at com.mysql.jdbc.Util.getInstance(Util.java:382)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 38 more
alexandrenilton

Ola Henrique.tenorio, tentei fazer o que vc me disse, colocar @Cascade(CascadeType.ALL), mas a versão do meu hibernate não consegue achar essa annotation.
Então, segue o erro que está apresentando com o código anterior.

Hibernate: insert into PESSOA (ID_CONJUGE, CPF, DATA_CASAMENTO, ID_ESCOLARIDADE, ID_ESTADO_CIVIL, ORGAO_EMISSOR, RG, TXT_NOM_EMPRESA, TXT_NOM_MAE, TXT_NOM_NACIONALIDADE, TXT_NOM_NATURALIDADE, TXT_NOM_PAI, TXT_NOM_PROFISSAO, TXT_NOME, ID_UF_NACIONALIDADE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into FILHO (ID_PESSOA, SN_EVANGELICO, NOME) values (?, ?, ?)
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not insert: [org.adev.cm.model.entity.Filho]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2327)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2834)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
	at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
	at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
	at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:475)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:353)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
	at org.adev.com.model.dao.PessoaDAO.loader(PessoaDAO.java:63)
	at org.adev.cm.control.LoaderController.loader(LoaderController.java:32)
	at org.loader.LoaderDB.loader(LoaderDB.java:13)
	at org.loader.LoaderDB.main(LoaderDB.java:8)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'ID_PESSOA' cannot be null
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
	at com.mysql.jdbc.Util.getInstance(Util.java:382)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1039)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 38 more
Henrique.tenorio

Qual Banco de Dados voçê esta usando?
acho que pode ser erro na chave primaria você vai ter que especificar o tipo de estratégia para a chave primaria das tabelas.

Si for mysql:

//Tabela Pessoa
    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "ID_PESSOA")  
    private Long idPessoa;

    //Tabela Filho
    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "ID_FILHO")  
    private Long idFilho;

Se não der certo tira a linha @GeneratedValue(strategy=GenerationType.AUTO) das entidade e tenta dinovo. Lembrando que quando voçê ultilizar @GeneratedValue(strategy=GenerationType.AUTO) na hora de inserir dados na entidade não precisa setar nada para o idPessoa e idFilho.

alexandrenilton

Henrique.tenorio:
Qual Banco de Dados voçê esta usando?
acho que pode ser erro na chave primaria você vai ter que especificar o tipo de estratégia para a chave primaria das tabelas.

Si for mysql:

//Tabela Pessoa
    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "ID_PESSOA")  
    private Long idPessoa;

    //Tabela Filho
    @Id  
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "ID_FILHO")  
    private Long idFilho;

Se não der certo tira a linha @GeneratedValue(strategy=GenerationType.AUTO) das entidade e tenta dinovo. Lembrando que quando voçê ultilizar @GeneratedValue(strategy=GenerationType.AUTO) na hora de inserir dados na entidade não precisa setar nada para o idPessoa e idFilho.

Poxa… eh isso mesmo…
Uso o MySQL, e como de costume, a pk é AUTO_INCREMENT…

Valeu, mt obrigado

Criado 5 de fevereiro de 2011
Ultima resposta 7 de fev. de 2011
Respostas 5
Participantes 2