2017-09-22 1 views
0

Travail sur le projet Spring Data + JPA + Hibernate + Maven.Oracle Table a été supprimé par Hibernate; retourné à DB de la corbeille. Erreur d'obtention "Erreur SQL: 942, SQLState: 42000"

Séquence d'événements:

  1. J'ai eu un code de travail en utilisant ce qui précède qui a utilisé pour interroger la table à l'aide FavoritesJPARespository. J'ai ajouté une ligne props.put("hibernate.hbm2ddl.auto"); aux propriétés JPA et la liste Favoris est supprimée. Panique pure!

    properties.put ("hibernate.hbm2ddl.auto", environnement.getRequiredProperty ("hibernate.hbm2ddl.auto"));

  2. Je commente le code qui a causé le problème. Je demande au DBA de recréer la table et elle dit que c'était dans la poubelle et elle l'a "flashée".

    private Map jpaProperties() { Map<String,Object> properties = new HashMap<String,Object>(); properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); // properties.put("hibernate.hbm2ddl.auto", // environment.getRequiredProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); return properties; }

méthode de configuration de base de données:

`@Primary 
@Bean(name = "dataSource") 
public DataSource dataSource() { 
DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
dataSource.setDriverClassName(environment 
      .getRequiredProperty("rg.jdbc.driverClassName")); 
dataSource.setUrl(environment.getRequiredProperty("rg.jdbc.url")); 
dataSource.setUsername(environment 
      .getRequiredProperty("rg.jdbc.username")); 
dataSource.setPassword(environment 
      .getRequiredProperty("rg.jdbc.password")); 
return dataSource; 
}` 
  1. Je peux voir le tableau dans SQL Developer en utilisant les mêmes informations d'identification utilisateur utilisé dans le code . Toutefois, si j'interroge la base de données à l'aide de la classe étendue JPARepository à l'aide de findAll().

Je reçois l'erreur suivante. Je peux voir la Table dans la DB, mais pas via le code Java.

Quelqu'un peut-il m'aider à comprendre ce que fait la propriété ci-dessus et pourquoi je ne peux pas voir la table via le code, mais peut le voir dans SQL Developer? Aussi, comment puis-je résoudre ce problème?

Hibernate: 
select 
    favorite0_.FAVORITE_ID as FAVORITE_ID1_1_, 
    favorite0_.category as category2_1_, 
    favorite0_.created as created3_1_, 
    favorite0_.CREATED_BY as CREATED_BY4_1_, 
    favorite0_.description as description5_1_, 
    favorite0_.name as name6_1_, 
    favorite0_.OBJECT_TYPE_ID as OBJECT_TYPE_ID7_1_ 
from 
    FAVORITES favorite0_ 
2017-09-22 02:21:20 [http-bio-8080-exec-2] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 942, SQLState: 42000 
2017-09-22 02:21:20 [http-bio-8080-exec-2] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ORA-00942: table or view does not exist 

Sep 22, 2017 1:24:11 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/RG-NG] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause 
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist 

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017) 
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) 
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) 
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) 
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215) 
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58) 
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:776) 
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034) 
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) 
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867) 
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) 
at org.hibernate.loader.Loader.getResultSet(Loader.java:2117) 
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1900) 
+1

'props.put ("hibernate.hbm2ddl.autopdate")' est pas correct, s'il vous plaît poster le code réel. Pour un 'put' attend deux paramètres, et la propriété serait' hibernate.hbm2ddl.auto'. –

+0

utilisez-vous le même utilisateur Oracle pour le code et les connexions développeur SQL? – Zeromus

+0

@MarkRotteveel vous avez raison. J'ai mis à jour l'extrait de code. properties.put ("hibernate.hbm2ddl.auto", environnement.getRequiredProperty ("hibernate.hbm2ddl.auto")); –

Répondre

0

Je suppose que vous aviez déjà des privilèges sur la table bu parce qu'il a été abandonné vos privilèges sont partis, demandez à votre DBA pour restaurer les privilèges sur la table.

+0

J'essaye juste de trouverAll(). Est-ce que cela sera affecté? L'erreur indique que la table n'existe pas. Je peux toujours demander au DBA de restaurer les privilèges, mais je veux m'assurer que c'est la bonne demande car plusieurs personnes sont copiées :) –

+0

si vous n'avez pas le privilège de voir la table bien sûr que l'erreur sera levée ... mais vous avez dit que vous pouvez voir la table avec le même utilisateur – Zeromus

+2

cette erreur signifie généralement que vous n'avez pas assez de privilèges pour voir la table afin que Oracle lève une exception disant que la table n'existe pas. Etes-vous sûr d'utiliser le même compte dans SQL Developer et Hibernate, si vous pouvez voir la table avec SQL Developer, vous devriez pouvoir le lister via Hibernate. –

0

Merci à @CyrilleMODIANO et @Zeromus pour m'avoir indiqué dans la bonne direction. J'ai résolu le problème.

Il y avait 2 problèmes:

1) Je me tournai sur la validation du schéma.

properties.put("hibernate.hbm2ddl.auto", SchemaAutoTooling.VALIDATE.name().toLowerCase()); 

Cela m'a dit qu'il y avait un problème avec l'une des classes d'entité et cette annotation était absent pour la variable annotée avec @Id

@GeneratedValue(strategy = GenerationType.AUTO) 

2) L'injection de source de données a été se foiré. L'objet de source de données DB1 était injecté dans l'unité centrale de DB2.

L'ajout d'un qualificateur et l'attribution de noms uniques l'ont corrigé.

@Primary 
    @Bean(name = "rgDataSource") 
    public DataSource rgDataSource() 

    @Primary 
    @Bean(name = "rgEntityManagerFactory") 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
     EntityManagerFactoryBuilder builder, 
     @Qualifier("rgDataSource") DataSource dataSource) {