Pessoal, estou com problemas para persistir com hibernate três tabelas conforme descritas abaixo:
A tabela Tb_ModeloEspelho tem uma lista de Tb_Bloco na proporção 1…N, já para cada grupo eu posso ter uma lista de Tb_Lauda na proporção 0…N, quando eu mando persistir a Tb_ModeloEspelho com o comando merge ele dá o seguinte erro. "object references an unsaved transient instance - save the transient instance before flushing: model.Tb_Bloco"
Tb_ModeloEspelho
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name=“TBBLOCO”,
joinColumns=@JoinColumn(name =“ModeloEspelho_Id”),
inverseJoinColumns=@JoinColumn(name=“Bloco_Id”))
private Collection<Tb_Bloco> blocos = new ArrayList<Tb_Bloco>();
Tb_Bloco
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name=“TBLAUDA”,
joinColumns=@JoinColumn(name =“Bloco_Id”),
inverseJoinColumns=@JoinColumn(name=“Lauda_Id”))
private Collection<Tb_Lauda> lauda = new ArrayList<Tb_Lauda>();
Esqueci de mencionar o banco em questão é o POSTGRE
`em Tb_ModeloEspelho
@OneToMany(fetch=FetchType.EAGER, cascade = {Cascade.Persist}
`
Luciano, fiz a alteração, mas quando vai ser persistido o bloco dá a mensagem abaixo:
“null value in column “espelho_id” violates not-null constraint”
`
Coloque isso na entidade da tabela Tb_ModeloEspelho
@Id
@SequenceGenerator(name = “esp_generator”, sequenceName = “esp_seq”, initialValue = 1, allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “esp_generator”)
private Long id;
e isso na entidade da tabela Tb_Bloco
@Id
@SequenceGenerator(name = “bloco_generator”, sequenceName = “bloco_seq”, initialValue = 1, allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “bloco_generator”)
private Long id;
`
Coloquei, mas ainda continua o mesmo erro.
mar 11, 2016 8:54:44 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 23502
mar 11, 2016 8:54:44 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ERROR: null value in column "espelho_id" violates not-null constraint
Detalhe: Failing row contains (5, null, 0, 0, 0, null, null).
mar 11, 2016 8:54:44 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
Exception in thread "main" javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
at teste.Testes.main(Testes.java:39)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:82)
... 1 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:129)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
... 1 more
Caused by: org.postgresql.util.PSQLException: ERROR: null value in column "espelho_id" violates not-null constraint
Detalhe: Failing row contains (5, null, 0, 0, 0, null, null).
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
... 14 more
Pelo o que vi das mensagens de erro, parece que o insert está funcionando da modeloespelho, programa, mas quando vai fazer o insert do bloco ele não está conseguindo pegar o idmodeloespelho para fazer o vinculo.
<?xml version="1.0" encoding="UTF-8"?>
org.hibernate.ejb.HibernatePersistence
<persistence-unit name="DaNews">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.username" value="danews_teste" />
<property name="hibernate.connection.password" value="danews_teste" />
<property name="hibernate.connection.url" value="jdbc:postgresql://10.10.10.10:5432/danews_teste" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
Ok, cancele a implantação no servidor e manda limpar e construir o projeto novamente
Luciano, fiz isto e não funcionou, parece que tem algo errado no mapeamento @onetomany entre modeloespelho e bloco, eu fiz um teste e deixei somente o mapeamento @manytoone de espelho e programa e a persistência funcionou.
Na tabela bloco que esta sendo criada no banco tem o campo espelho_id e também está sendo criada a tabela de relacionamento modeloespelho_bloco, mas este modelo de tabelas está errado, não era para criar a tabela modeloespelho_bloco, acredito que o erro está no mapeamento do bloco na modeloespelho.
@OneToMany(fetch=FetchType.EAGER, cascade= CascadeType.PERSIST)
@JoinTable(name="modeloespelho_bloco")
private Collection blocos = new ArrayList();
`percebi agora o problema, não existe referência entre as entidades
troque isso:
private Collection blocos = new ArrayList();
por isso:
private List< Bloco> blocos = new ArrayList( );
e isso:
private Collection lauda = new ArrayList();
por isso:
pirvate List< Lauda> laudas = new ArrayList();
isso imaginando que suas entidades sejam Lauda e Bloco
`
Luciano, era isto mesmo. Obrigado.