Estou tentando persistir no banco (postgreesql) dados de uma universidade numa relacao 1-n… so que o problema é que o campo universidade_id da tabela Centro não está sendo populado automaticamente… pois pelo que eu entendi qndo é criada a tabela universidade o id dela é passado para este campo de forma automatica(join do annotation)…
Bem abaixo coloque a tabela criada e as classes utilizadas.
Por favor me ajudem que isso ta medando uma dor de cabeça =/
Tabelas:
CREATE TABLE Universidade (
id SERIAL NOT NULL ,
nome VARCHAR(300) ,
PRIMARY KEY(id));
CREATE TABLE Centro (
id SERIAL NOT NULL ,
Universidade_id INTEGER NOT NULL ,
nome VARCHAR(300) ,
PRIMARY KEY(id) ,
FOREIGN KEY(Universidade_id)
REFERENCES Universidade(id));
CREATE INDEX Centro_FKIndex1 ON Centro (Universidade_id);
CREATE INDEX IFK_Rel_01 ON Centro (Universidade_id);
Classe Centro
@Entity
@Table(name="Centro")
@SequenceGenerator(name = "seq_centro", sequenceName = "seq_centro", allocationSize = 1)
public class Centro {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_centro")
//@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
private String nome;
private Universidade universidade;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="universidade_id",
insertable=true, updatable=true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
public Universidade getUniversidade() {
return universidade;
}
public void setUniversidade(Universidade universidade) {
this.universidade = universidade;
}
}
Classe Universidade:
@javax.persistence.Entity
@javax.persistence.Table(name="Universidade")
@SequenceGenerator(name = "seq_universidade", sequenceName = "seq_universidade", allocationSize = 1)
public class Universidade {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_universidade")
// @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
private String nome;
private Collection<Centro> centros;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@OneToMany(mappedBy="universidade", fetch = FetchType.LAZY)
@Cascade(CascadeType.ALL)
public Collection<Centro> getCentros() {
return centros;
}
public void setCentros(Collection<Centro> centros) {
this.centros = centros;
}
}
Classe de Teste:
public class TesteUniversidade {
public static void main(String[] args) {
try {
Centro centro = new Centro();
centro.setNome("juca");
Universidade uni = new Universidade();
uni.setNome("juca");
Session session = HibernateUtil.getSession();
session.beginTransaction();
Universidade univ = new Universidade();
univ.setNome("Universidade Federal do Rio Grande do Norte");
Centro centro1 = new Centro();
centro1.setNome("Centro de Tecnologia");
centro1.setUniversidade(univ);
Centro centro2 = new Centro();
centro2.setNome("Centro de Humanas");
centro2.setUniversidade(univ);
univ.setCentros(new HashSet<Centro>());
univ.getCentros().add(centro1);
univ.getCentros().add(centro2);
session.save(centro1);
session.save(uni);
session.getTransaction().commit();
System.out.println("Gravado contato: " + uni.getId());
} catch (HibernateException e) {
e.printStackTrace();
}
}
}
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration()
.configure()
.buildSessionFactory();
} catch (Throwable ex) {
// Log exception!
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession() throws HibernateException {
return sessionFactory.openSession();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/teste</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password">lol321</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping class="Universidade"/>
<mapping class="Centro"/>
</session-factory>
</hibernate-configuration>
0 [main] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.5.2-Final
16 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.5.2-Final
16 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
16 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
16 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
125 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
141 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
141 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
203 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null
203 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
250 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: Universidade
281 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity Universidade on table Universidade
328 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: Centro
328 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity Centro on table Centro
328 [main] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: Contato
328 [main] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity Contato on table Contato
343 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Hibernate Validator not found: ignoring
375 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
375 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 20
375 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
390 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: org.postgresql.Driver at URL: jdbc:postgresql://localhost:5432/teste
390 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: {user=postgres, password=****}
484 [main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: PostgreSQL, version: 9.0.3
484 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 8.4 JDBC4 (build 702)
499 [main] INFO org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.PostgreSQLDialect
515 [main] INFO org.hibernate.engine.jdbc.JdbcSupportLoader - Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
515 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
515 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
515 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch size: 15
515 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch updates for versioned data: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): enabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Connection release mode: auto
515 [main] INFO org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
515 [main] INFO org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
515 [main] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
515 [main] INFO org.hibernate.cfg.SettingsFactory - Query language substitutions: {}
515 [main] INFO org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
515 [main] INFO org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
515 [main] INFO org.hibernate.cfg.SettingsFactory - Statistics: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
515 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
515 [main] INFO org.hibernate.cfg.SettingsFactory - Check Nullability in Core (should be disabled when Bean Validation is on): enabled
546 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
702 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
Hibernate:
select
nextval ('hibernate_sequence')
Hibernate:
select
nextval ('hibernate_sequence')
Hibernate:
insert
into
Centro
(nome, id)
values
(?, ?)
780 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23502
780 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Entrada em lote 0 insert into Centro (nome, id) values ('Centro de Tecnologia', '130') foi abortada. Chame getNextException para ver a causa.
780 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23502
780 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ERRO: valor nulo na coluna "universidade_id" viola a restrição não-nula
780 [main] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2395)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2858)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at TesteUniversidade.main(TesteUniversidade.java:38)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into Centro (nome, id) values ('Centro de Tecnologia', '130') foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2586)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1811)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2725)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 15 more
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2395)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2858)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at TesteUniversidade.main(TesteUniversidade.java:38)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into Centro (nome, id) values ('Centro de Tecnologia', '130') foi abortada. Chame getNextException para ver a causa.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2586)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1811)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2725)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 15 more