Estou com um problema referente a persistência usando hibernate com o uso de herança nas classes, pois na aplicação tenho a classe aluno, professor e pessoa, sendo esta última abstrata, e as outras herdando. Fiz o banco (postgreSQL) usando “inherits” na tabela aluno e professor, e na aplicação fiz desta forma:
init:
deps-jar:
Compiling 3 source files to /home/bruno/NetBeansProjects/IntroducaoHibernate01/build/classes
Note: /home/bruno/NetBeansProjects/IntroducaoHibernate01/src/introducaohibernate01/Main.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
compile:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.MappingException: Unknown entity: introducaohibernate01.Professor
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:548)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:96)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy0.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:24)
at introducaohibernate01.Main.main(Main.java:30)
Java Result: 1
debug:
CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)
pelo jeito você não disse para o JPA(Hibernate), que a classe Professor está mapeada. Você tem que ir no arquivo de configuração do Hibernate e inserir a classe Professor, com o caminho completo, pacote e tudo.
Olá Onhate!
Estive alterando algumas coisas nas classes, ficou assim agora:
A classe Pessoa
@MappedSuperclass
public abstract class Pessoa implements Serializable {
@GeneratedValue(strategy=GenerationType.AUTO)
A Classe Professor
@Entity
@Table(name="Professor")
public class Professor extends Pessoa implements java.io.Serializable{
@PrimaryKeyJoinColumn(name="matricula")
@JoinColumn(name="matricula")
@Id
private Integer matricula;
A classe Aluno
@Entity
@Table(name="Aluno")
public class Aluno extends Pessoa implements java.io.Serializable{
@PrimaryKeyJoinColumn(name="matricula")
@Id
private Integer matricula;
Agora a saida do erro é esta:
run:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.MappingException: Unknown entity: introducaohibernate01.Professor
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:548)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:96)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy0.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:24)
at introducaohibernate01.Main.main(Main.java:33)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
Achei este link informando sobre o log4j http://logging.apache.org/log4j/1.2/manual.html, mas não entendi como configurar isso, parece que é algo relacionado a conexão, não sei o que pode ser.
Cara o caminho da classe completo eh esse?
introducaohibernate01.introducaohibernate01.Aluno
Acho que você não precisa passar o atributo package enta assim:
Eu fiz a configuração de acordo com o que apareceu na janela de configuração do hibernate, existem campos a serem preenchidos e tinha lá, pacote e classe para indicar o caminho.
Não está certo?
Scaiocesar, fiz o que vc sugeriu, agora ele tenta persistir mas dá erro na hora de gravar no banco:
e.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:180)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:108)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy11.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:25)
at introducaohibernate01.Main.main(Main.java:33)
Caused by: org.postgresql.util.PSQLException: ERRO: valor nulo na coluna "codigo" viola a restrição não-nula
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:33)
... 23 more
Java Result: 1
debug:
CONSTRUÍDO COM SUCESSO (tempo total: 10 segundos)
Coloquei o código na tabela pessoa como “serial”, mas na minha classe pessoa está como “Integer”, se eu coloco p.setCodigo(123) acusa que não existe o atributo na classe Professor, ela está na classe Pessoa, e como no banco está serial acho que não vai aceitar tb. Como faço para serializar esse atributo “codigo” na classe Pessoa, usando alguma anotação do hibernate, para que coincida com o banco?
Muito obrigado pela dica Onhate, mas continua dando um erro que está me deixando intrigado, tô começando a achar que existe alguma coisa errada referente a configuração do hibernate, veja a saida do erro:
init:
deps-jar:
compile:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get or update next value
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.engine.TransactionHelper$1Work.doWork(TransactionHelper.java:41)
at org.hibernate.engine.transaction.Isolater$JdbcDelegate.delegateWork(Isolater.java:187)
at org.hibernate.engine.transaction.Isolater.doIsolatedWork(Isolater.java:43)
at org.hibernate.engine.TransactionHelper.doWorkInNewTransaction(TransactionHelper.java:51)
at org.hibernate.id.MultipleHiLoPerTableGenerator.generate(MultipleHiLoPerTableGenerator.java:189)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy11.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:25)
at introducaohibernate01.Main.main(Main.java:34)
Caused by: org.postgresql.util.PSQLException: ERRO: relação "hibernate_sequences" não existe
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
at org.hibernate.id.MultipleHiLoPerTableGenerator.doWorkInCurrentTransaction(MultipleHiLoPerTableGenerator.java:135)
at org.hibernate.engine.TransactionHelper$1Work.doWork(TransactionHelper.java:38)
... 21 more
Java Result: 1
debug:
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)
O que seria este trecho?
og4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Como o erro é referente á classe ProfessorDAO, aqui está o código da classe:
public class ProfessorDAO {
private Session session;
public ProfessorDAO(){
}
public void salvarProfessor(Professor p){
session = ConnectDB.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(p);
session.beginTransaction().commit();
}
public List listarProfessor(){
session = ConnectDB.getSessionFactory().openSession();
session.beginTransaction();
List l1 = session.createQuery("from Professor").list();
session.getTransaction().commit();
return l1;
}
}
Deixei a classe Pessoa assim:
@MappedSuperclass
public abstract class Pessoa implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private int id;
A classe Aluno
@Entity
@Table(name="Aluno")
@Inheritance(strategy=InheritanceType.JOINED)
public class Aluno extends Pessoa implements java.io.Serializable{
@Id
private Integer matricula;
A classe Professor
@Entity
@Table(name="Professor")
@Inheritance(strategy=InheritanceType.JOINED)
public class Professor extends Pessoa implements java.io.Serializable{
@Id
private Integer matricula;
O mapeamento está correto?
Está td adicionado ao projeto, não existe nada a ser resolvido no projeto em relação a bibliotecas.
Têm alguma idéia?
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "professor_id")
@SequenceGenerator(name = "professor_id", sequenceName = "professor_id", allocationSize =1)
private Integer matricula;
Isso vai criar um sequence no banco chamado professor_id, ai cada novo registro ele pega um numero incremental
Tentei com a sua dica, mas continua o erro, isso tá parecendo ser algo com o hibernate.
init:
deps-jar:
Compiling 2 source files to /home/bruno/NetBeansProjects/IntroducaoHibernate01/build/classes
compile:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get or update next value
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.engine.TransactionHelper$1Work.doWork(TransactionHelper.java:41)
at org.hibernate.engine.transaction.Isolater$JdbcDelegate.delegateWork(Isolater.java:187)
at org.hibernate.engine.transaction.Isolater.doIsolatedWork(Isolater.java:43)
at org.hibernate.engine.TransactionHelper.doWorkInNewTransaction(TransactionHelper.java:51)
at org.hibernate.id.MultipleHiLoPerTableGenerator.generate(MultipleHiLoPerTableGenerator.java:189)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy13.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:25)
at introducaohibernate01.Main.main(Main.java:34)
Caused by: org.postgresql.util.PSQLException: ERRO: relação "hibernate_sequences" não existe
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
at org.hibernate.id.MultipleHiLoPerTableGenerator.doWorkInCurrentTransaction(MultipleHiLoPerTableGenerator.java:135)
at org.hibernate.engine.TransactionHelper$1Work.doWork(TransactionHelper.java:38)
... 21 more
Java Result: 1
debug:
CONSTRUÍDO COM SUCESSO (tempo total: 9 segundos)
Tô achando que falta alguma coisa ou configurar algo naquela mensagem:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
E ainda está acusando
Caused by: org.postgresql.util.PSQLException: ERRO: relação "hibernate_sequences" não existe
Tive progressos, alterei as classes e agora o erro é na hora de gerar o ID na classe Pessoa.
A saida do erro é esta:
init:
deps-jar:
Compiling 1 source file to /home/bruno/NetBeansProjects/IntroducaoHibernate01/build/classes
compile:
run:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Criação da SessionFactory falhou org.hibernate.AnnotationException: Unknown Id.generator: id
Exception in thread "main" java.lang.ExceptionInInitializerError
at introducaohibernate01.ConnectDB.<clinit>(ConnectDB.java:24)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:23)
at introducaohibernate01.Main.main(Main.java:38)
Caused by: org.hibernate.AnnotationException: Unknown Id.generator: id
at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:392)
at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1719)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1171)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:706)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:452)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:268)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1210)
at introducaohibernate01.ConnectDB.<clinit>(ConnectDB.java:20)
... 2 more
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
A classe Pessoa
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="id")
private int id;
A classe Aluno sem “ID”, pois aparecia erro quando colocava @Id, ficou só @Id na classe Pessoa
@Entity
@Table(name="Aluno")
public class Aluno extends Pessoa implements java.io.Serializable{
@PrimaryKeyJoinColumn(name="matricula")
//@Id
@Column
private Integer matricula;
A classe Professor, tb sem @Id
@Entity
@Table(name="Professor")
public class Professor extends Pessoa implements java.io.Serializable{
@PrimaryKeyJoinColumn(name="matricula")
//@Id
@Column
private Integer matricula;
Estou quase lá, só falta resolver esse gerador de ID.
Valeu pela dica scaiocesar, fiz a alteração que vc sugeriu, mas descobri que existe ainda um erro ao criar uma sessionFactory devido a geração de ID, veja a saida do erro:
init:
deps-jar:
compile:
run:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Criação da SessionFactory falhou Unknown Id.generator: id
Exception in thread "main" java.lang.ExceptionInInitializerError
at introducaohibernate01.ConnectDB.<clinit>(ConnectDB.java:24)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:23)
at introducaohibernate01.Main.main(Main.java:39)
Caused by: org.hibernate.AnnotationException: Unknown Id.generator: id
at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:392)
at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1719)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1171)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:706)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:452)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:268)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1210)
at introducaohibernate01.ConnectDB.<clinit>(ConnectDB.java:20)
... 2 more
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
A classe ConnectDB.java responsável pela criação:
public class ConnectDB {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Criação da SessionFactory falhou " + ex.getMessage());
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa implements Serializable {
@Id
@SequenceGenerator(name = "pessoa_id", sequenceName = "pessoa_id", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="pessoa_id")
private int id;
A saida foi esta:
init:
deps-jar:
Compiling 1 source file to /home/bruno/NetBeansProjects/IntroducaoHibernate01/build/classes
compile:
run:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select next value for pessoa_id from dual_pessoa_id
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get next sequence value
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96)
at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:53)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:98)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy12.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:25)
at introducaohibernate01.Main.main(Main.java:39)
Caused by: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "value"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75)
... 18 more
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
Agora o erro é:
Hibernate: select next value for pessoa_id from dual_pessoa_id
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get next sequence value
Acho que agora ficou mais fácil descobrir o motivo do erro.
Oi pessoal!
Estou precisando de um exemplo de arquivo hibernate.hbm.xml, pois o Netbeans está com algum problema que simplesmente ao clicar em “Finalizar” a tela não muda, consigo fechar a janela e a aplicação não trava, mas tb não me deixa criar este arquivo:
Queria criar este arquivo pra depois adicionar uma linha de mapeamento lá no hibernate.cfg.xml. O problema aqui tá parecendo configuração do hibernate.
Pesquisei no fórum e li uns PDFs do Annotation, depois de algumas alterações estou tendo este erro:
Hibernate: select next value for hibernate_sequence from dual_hibernate_sequence
27/09/2009 17:57:16 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 42601
27/09/2009 17:57:16 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERRO: erro de sintaxe em ou próximo a "value"
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get next sequence value
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96)
at org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:58)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
at $Proxy12.save(Unknown Source)
at introducaohibernate01.ProfessorDAO.salvarProfessor(ProfessorDAO.java:25)
at introducaohibernate01.Main.main(Main.java:46)
Caused by: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "value"
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75)
... 18 more
debug:
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)
Ele insiste em acusar erro de sintaxe, porém na classe ProfessorDAO está td certo:
public class ProfessorDAO {
private Session session;
public ProfessorDAO(){
}
public void salvarProfessor(Professor p){
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(p);
session.beginTransaction().commit();
}
public List listarProfessor(){
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
List l1 = session.createQuery("from Professor").list();
session.getTransaction().commit();
return l1;
}
}
Meu HibernateUtil:
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration().configure("/Resources/hibernate.cfg.xml").buildSessionFactory();
//cfg = new AnnotationConfiguration();
} catch (Throwable ex) {
// Log the exception.
System.err.println("A criação da SessionFactory falhou." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
sessionFactory = new AnnotationConfiguration().configure("/Resources/hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
return sessionFactory;
}
}