Estou tentando fazer um relacionamento mas não está dando muito certo!
Tenho duas tabelas: ‘usuario’ e ‘disponibilidade’;
usuario:id;(PK)nome;
disponibilidade:id;(PK)usuario_id;(FK)disponivel;
Preciso buscar um usuario e saber se ele está disponivel. Fiz o mapeamento + ou - assim:
@Entity@Table(name="usuario",schema="********")publicclassUsuarioimplementsSerializable{/** * */privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="id")privateintid;@OneToOne(mappedBy="usuario",cascade=CascadeType.ALL,fetch=FetchType.EAGER)privateDisponibilidadedisponibilidades;@Column(name="nome")privateStringnome;//getter e setter@Entity@Table(name="disponibilidade",schema="******")publicclassDisponibilidadeimplementsSerializable{/** * */privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateintid;@JoinColumn(name="usuario_id")privateUsuariousuario;@Column(name="disponivel")privateintdisponivel;//getter e setter
Cara, pelo o que entendi de seu codigo, voce deve ter um relacionamento de UM usuario para MUITAS disponilidades e nao UM para UM como voce esta modelando! Para ver isso basta realizar o seguinte select:
//pesquisando todas as disponibilidades do usuario com id = 1selectdiponibilidade.idfromusuario,disponibilidadewhereusuario.id=disponibilidade.usuario_idandusuario.id=1
Consequentemente em seu Entity Bean voce deve substituir a atributo:
O relacionamento no meu caso seria @OneToOne.
a disponibilidade citada teria apenas duas respostas: nulo ou x;
então preciso fazer uma consulta que liste o usuario e a sua disponibilidade daquele momento.
vc faz idéia da onde esteja o erro?
Vini_Fernandes
Cara, supondo que voce tenha um relacionamento one-to-one entao vejo dois possiveis erros em seu codigo:
publicclassDisponibilidadeimplementsSerializable{/** * */privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)//aqui deveria ter uma @Column(name = "id") privateintid;@JoinColumn(name="usuario_id")/* *como voce tem um on-to-one aqui voce deveria ter algo *@OneToOne(mappedBy = "disponibilidade", cascade = CascadeType.ALL, fetch = FetchType.EAGER) *analogo ao que voce fez na classe usuario */privateUsuariousuario;
Outra coisa, veja se nao esta faltando um atributo foreign-key na annotation, por exemplo: @OneToOne(mappedBy = “usuario”, cascade = CascadeType.ALL, fetch = FetchType.EAGER, foreign-key = “sua chave estrangeira”)
Veja se funciona, mas eu ainda acho que NAO se trata de um relacionamento one-to-one
Ate
otavio
Renato, dizer que deu um erro e pedir ajuda é muuuito vago. Coloque aqui a mensagem de erro e o stacktrace, assim fica bem mais fácil te ajudar.
R
Renato_natos
Pois então, fiz um metodo utilizando apenas a tabela usuario e não me resultou erro nenhum, mas quando utilizei o relacionamento apresenta :
o que tem nessa HibernateTransactionUtils.java:51?
R
Renato_natos
Acontece que fiz o mapeamento da tabela usuario sem nenhuma relação e criei um método para buscar por id, e deu certo, e agora inclui a relação de um para um e pedi para buscar por id e deu errado.
Pelo que pude perceber o erro está no mapeamento das tabelas. Mas mesmo assim na linha 51 têm o seguinte código:
session = sessionFactory.openSession();
este programa já foi testado anteriormente e deu certo, mas não consigo tirar da cabeça que o erro é do mapeamento!!
Obrigado
O erro está nessa classe: HibernateTransactionUtils.java:51
Mande o código completo dela. Provavelmente o sessionFactory está null.
R
Renato_natos
publicclassHibernateTransactionUtils{privatestaticSessionFactorysessionFactory;privatestaticLoggerlog=Logger.getLogger(HibernateTransactionUtils.class);;publicHibernateTransactionUtils(){try{// Cria a instância da SessionFactorysessionFactory=newAnnotationConfiguration().configure().buildSessionFactory();HibernateTransactionUtils.setSessionFactory(sessionFactory);}catch(Throwableex){// Não foi possível iniciar a SessionFactory - abortando a// inicialização da aplicação e logando o problema-log.fatal("\n\n\n\n\n\n\n>>>>>Criacao do SessionFactory falhou.\n"+ex);}}/* * Session Factory que gerencia as sessões do Hibernate */privatestaticfinalThreadLocal<Session>tlSession=newThreadLocal<Session>();/** * Método responsável por retornar uma sessão com o Hibernate * @return * @throws HibernateException */publicstaticSessiongetSession()throwsHibernateException{System.out.println("UTILD");Sessionsession=(Session)tlSession.get();// Abre uma nova session caso esta Thread não tenha uma vinculadaif(session==null||!session.isOpen()){session=sessionFactory.openSession();// Armazena na variável ThreadLocaltlSession.set(session);}HibernateTransactionUtils.getSFStatistics();returnsession;}/** * Método responsável por fechar uma conexão com o Hibernate * @throws HibernateException */publicstaticvoidcloseSession()throwsHibernateException{Sessions=(Session)tlSession.get();if(s!=null)s.close();tlSession.set(null);}/** * Retorna uma referência para a SessionFactory * @return */publicstaticSessionFactorygetSessionFactory(){returnsessionFactory;}/** * Configura um SessionFactory SessionFactory * @return */publicstaticvoidsetSessionFactory(SessionFactoryfactory){sessionFactory=factory;sessionFactory.getStatistics().setStatisticsEnabled(true);//Estatísticas de performance do Hibernate.}/** * Método responsável por realizar um rollback na transação aberta pelo Hibernate * * @param transaction */publicstaticvoidrollback(Transactiontransaction){if(transaction!=null){try{transaction.rollback();}catch(HibernateExceptionex){// Logar e retornar a execução de um rollback;log.debug(">>>>>Não foi possível realizar o rollback");}}}/** * Método responsável por realizar um commit na transação aberta pelo Hibernate * * @param transaction */publicstaticvoidcommit(Transactiontransaction){if(transaction!=null){try{transaction.commit();}catch(HibernateExceptionex){log.debug(">>>>>Não foi possível realizar o commit.");}}}publicstaticMap<String,String>getSFStatistics(){Statisticsstats=sessionFactory.getStatistics();HashMap<String,String>statMap=newHashMap<String,String>();statMap.put("open_sessions",Long.toString(stats.getSessionOpenCount()));System.out.println("\n\n>>>>>>>>>>>>>>>>>Open Sessions => "+statMap.get("open_sessions"));returnnull;}publicstaticTransactiongetTransaction(){returnnull;}}
otavio
publicHibernateTransactionUtils(){try{//CriaainstânciadaSessionFactorysessionFactory=newAnnotationConfiguration().configure().buildSessionFactory(); HibernateTransactionUtils.setSessionFactory(sessionFactory); }catch(Throwableex){//NãofoipossíveliniciaraSessionFactory-abortandoa//inicializaçãodaaplicaçãoelogandooproblema-log.fatal("\n\n\n\n\n\n\n>>>>>Criacao do SessionFactory falhou.\n"+ex); }
}
Pelo que notei você está tentando chamar o método public static Session getSession() throws HibernateException. Note que ele é static, ou seja, NUNCA chama o construtor. Ou seja, tua sessionFactory SEMPRE será NULL, dando o NullPointerException.
Altere para um bloco estático:
static{try{//CriaainstânciadaSessionFactorysessionFactory=newAnnotationConfiguration().configure().buildSessionFactory(); setSessionFactory(sessionFactory); }catch(Exceptionex){//NãofoipossíveliniciaraSessionFactory-abortandoa//inicializaçãodaaplicaçãoelogandooproblema-log.fatal("\n\n\n\n\n\n\n>>>>>Criacao do SessionFactory falhou.\n"+ex); }
}
Outra coisa, NUNCA use catch de Throwable, pois ela captura tanto exceptions como errors, sendo esses segundos basicamente não tratáveis.