Announcement

Collapse
No announcement yet.

Hibernate query ohne Ergebnis

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hibernate query ohne Ergebnis

    hallo zusammen,

    ich versuche aus einer DB user Objekte zu lesen:

    So gehts:
    Code:
            Session session = sessionFactory.getCurrentSession();
            Query query = session.createSQLQuery("select [USERNAME], [PASSWORD] from [BoeMonVis].[dbo].[USER]");
            List list = query.list();
    So nicht:
    Code:
            Session session = sessionFactory.getCurrentSession();
            Criteria criteria = session.createCriteria(User.class);
            List<User> userList = criteria.list();
    So auch nicht:
    Code:
            Session session = sessionFactory.getCurrentSession();
           Query query = sessionFactory.getCurrentSession().createQuery("from user");
            List<User> userList = query.list();
    Bei den letzten beiden Varianten ist die List.size() = 0, auch sehe ich gar keine Query im Log, trotz entsprechender Log4j config. Wo ist da den mein Problem? Ich würde gern 2. Variante fahren, da ich es cool finde, aber da mach ich wohl grundsätzlich was falsch. Jemand einen Tip?

    Danke!!!

  • #2
    "Geht nicht" ist kein Fehler.

    Sicherlich ist Nr. 1 nicht der Weg, wenn man einen OR-Mapper einsetzt.

    Was steht in den Logs? Welche Exceptions werden geworfen, sofern du sie nicht abfängst, wie sieht die Konfiguration aus? Wie ist die Klasse annotiert? Wo sind die Annotationen?

    Eine Möglichkeit, eine Verbindung aufzubauen:
    [highlight=java]
    public class HibernateUtil
    {
    private static Logger logger=Logger.getLogger(HibernateUtil.class);
    private static SessionFactory sessionFactory;
    private static Transaction transaction;
    private static Session hibernatesession=null;

    public static void createConfiguration()
    {
    logger.info("Create DB-Verbindung");
    try
    {
    AnnotationConfiguration conf=new AnnotationConfiguration().configure("hibernate.cfg .xml");
    conf=conf.setProperty("hibernate.connection.url"," jdbc:hsqldb:file:"+PFAD ZU DEINER DB-> HIER ISR ES EINE HSQL DB
    sessionFactory=conf.buildSessionFactory();
    }
    catch(Throwable ex)
    {
    logger.error("Fehler bei der Konfiguration: "+ex.getMessage());
    throw new ExceptionInInitializerError(ex);
    }
    }

    public static Session getSession() throws HibernateException
    {
    if(sessionFactory==null)
    {
    createConfiguration();
    }
    try
    {
    if(hibernatesession==null)
    {
    hibernatesession=sessionFactory.openSession();
    logger.info("Neue Session geöffnet");
    }
    }
    catch(HibernateException ex)
    {
    logger.error("Fehler beim öffnen der Session: "+ex.getMessage(),ex);
    }
    return hibernatesession;
    }

    public static boolean beginDBTransaction()
    {
    try
    {
    transaction=hibernatesession.beginTransaction();
    }
    catch(HibernateException ex)
    {
    logger.error("Fehler beim Beginn der Transaction: "+ex.getMessage());
    return false;
    }

    return true;
    }

    public static void endDBTransaction()
    {
    try
    {
    hibernatesession.flush();
    transaction.commit();
    hibernatesession.disconnect();
    sessionFactory.close();
    hibernatesession=null;
    }
    catch(Exception ex)
    {
    logger.error("Fehler beim Beenden der Transaction: "+ex.getMessage());
    }
    }

    public static Transaction getTransaction()
    {
    return transaction;
    }

    }

    [/highlight]

    Aufbau mit

    [highlight=java]

    HibernateUtil.getSession();
    if(!HibernateUtil.beginDBTransaction())
    {
    logger.error("keine Session bekommen");
    }
    logger.info("Session bekommen");

    [/highlight]

    Die Confif dazu -> hier ist es eine HSQL DB, deren Pfad in der Anwendung bestimmt wird

    [highlight=java] <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
    [<!ENTITY mappings SYSTEM "classpath:///hibernate_mappings.cfg.xml">]>
    <hibernate-configuration>
    <session-factory>
    <property name="connection.driver_class">org.hsqldb.jdbcDriv er
    </property>
    <property name="connection.username">sa
    </property>
    <property name="connection.password">
    </property>
    <property name="connection.shutdown">true
    </property>
    <property name="connection.pool_size">10
    </property>
    <property name="dialect">org.hibernate.dialect.HSQLDialect
    </property>
    <property name="current_session_context_class">thread
    </property>
    <property name="show_sql">false
    </property>
    <property name="hbm2ddl.auto">update
    </property>
    &mappings;
    </session-factory>
    </hibernate-configuration> [/highlight]

    Die Mappings-Datei

    [highlight=java]
    <mapping class="PACKAGE ZU DEINER KLASSE UND KLASSENAME bsp. de.meineanwendung.Klasse1"/> [/highlight]
    Zuletzt editiert von Christian Marquardt; 10.08.2013, 15:06.
    Christian

    Comment


    • #3
      Hallo Christian,

      erst mal danke für deine schnelle Antwort! Das ist ja mein Problem, ich bekomme keine Fehlermeldungen.
      Für diesen Code:
      Code:
           Session session = sessionFactory.getCurrentSession();
              Criteria criteria = session.createCriteria(User.class);
              List<User> userList = criteria.list();
              logger.error("criteria result size "+userList.size())
      Bekomme ich diesen Log-Auszug:
      Code:
      INFO:   15:04:16,191 DEBUG UsernamePasswordAuthenticationFilter:190 - Request is to process authentication
      INFO:   15:04:16,191 DEBUG ProviderManager:152 - Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
      INFO:   15:04:16,191 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
      INFO:   15:04:16,191 DEBUG HibernateTransactionManager:366 - Creating new transaction with name [dao.UserDAOImpl.findUserByUsername]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
      INFO:   15:04:16,191 DEBUG SessionImpl:220 - opened session at timestamp: 13761398561
      INFO:   15:04:16,191 DEBUG HibernateTransactionManager:494 - Opened new Session [org.hibernate.impl.SessionImpl@10ca693] for Hibernate transaction
      INFO:   15:04:16,191 DEBUG HibernateTransactionManager:505 - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@10ca693]
      INFO:   15:04:16,191 DEBUG JDBCTransaction:54 - begin
      INFO:   15:04:16,191 DEBUG ConnectionManager:421 - opening JDBC connection
      INFO:   15:04:16,191 DEBUG JDBCTransaction:59 - current autocommit status: true
      INFO:   15:04:16,191 DEBUG JDBCTransaction:62 - disabling autocommit
      INFO:   15:04:16,206 DEBUG HibernateTransactionManager:570 - Exposing Hibernate transaction as JDBC transaction [jdbc:jtds:sqlserver://XXXXXXXXX, jTDS Type 4 JDBC Driver for MS SQL Server and Sybase]
      INFO:   15:04:16,206 ERROR UserDAOImpl:61 - criteria result size 0
      INFO:   15:04:16,206 DEBUG HibernateTransactionManager:844 - Initiating transaction rollback
      INFO:   15:04:16,206 DEBUG HibernateTransactionManager:673 - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@10ca693]
      INFO:   15:04:16,206 DEBUG JDBCTransaction:152 - rollback
      INFO:   15:04:16,227 DEBUG JDBCTransaction:193 - re-enabling autocommit
      INFO:   15:04:16,230 DEBUG JDBCTransaction:163 - rolled back JDBC Connection
      INFO:   15:04:16,230 DEBUG ConnectionManager:302 - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
      INFO:   15:04:16,230 DEBUG HibernateTransactionManager:735 - Closing Hibernate Session [org.hibernate.impl.SessionImpl@10ca693] after transaction
      INFO:   15:04:16,230 DEBUG SessionFactoryUtils:800 - Closing Hibernate Session
      INFO:   15:04:16,230 DEBUG ConnectionManager:441 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
      INFO:   15:04:16,230 DEBUG ConnectionManager:302 - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
      Der einzige Error stammt von mir selbst. Die Session is da (würde ich behaupten, und wenn ich es über Variante 1 fahre, klappt es ja auch. Ich möchte es aber schon mit der hier gezeigten Variante machen.

      Wo ist das Problem???

      Comment


      • #4
        Wie sehen die Annotationen aus?
        Christian

        Comment


        • #5
          Hallo Chris,

          die User entity:
          Code:
          @Entity
          @Table(name="USER")
          public class User implements Serializable {
              
              @Id
              @Column(name="ID")
              @GeneratedValue
              @NotNull
              private Long id;
              
              @Column(name="USERNAME")    
              @NotNull    
              private String username;
              
              @Column(name="PASSWORD")
              @NotNull    
              private String password;
              
              @Column(name="AUTHORITY")
              @NotNull    
              private String authority;
              
              @Column(name="ENABLED")
              @NotNull    
              private boolean enabled;
          Der Rumpf der UserDAOImpl:
          Code:
          @Repository
          @Transactional
          @SuppressWarnings("unchecked")
          public class UserDAOImpl implements UserDAO {
          
              //log handler
              private static final Logger logger = Logger.getLogger(UserDAOImpl.class);    
              
              private SessionFactory sessionFactory;
          
              @Autowired
              @Qualifier("sessionFactory")
              public void setSessionFactory(SessionFactory sessionFactory) {
                  this.sessionFactory = sessionFactory;
              }
          
              @Override
              public User findUserByUsername(String username) {
             ...
             }
          Meintest du dies?

          Comment


          • #6
            Und wie sieht die hibernate config aus?
            Christian

            Comment


            • #7
              So:
              applicationContext.xml
              Code:
                  <!-- hibernate configuration -->      
                  <bean id="propertyConfigurer"
                        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                      <property name="location" value="/WEB-INF/jdbc.properties"/>
                  </bean>
              
                  <bean id="sessionFactory"
                        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
                      <property name="dataSource"         ref="dataSource"/>
                      <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>           
                      <property name="hibernateProperties">
                          <props>
                              <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                              <prop key="hibernate.show_sql">true</prop>
                              <prop key="hibernate.format_sql">true</prop>
                          </props>
                      </property>
                  </bean>
              ne externe hibernate-cfg.xml habe ich nicht, da nix drin stand.

              Comment


              • #8
                Du benutzt offenbar noch ein anderes Framework dazu -> Spring. Würde jetzt das Mapping der Klassen vermissen -> Siehe Beitrag #2. Hibernate müssen die Klassen bekannt gemacht werden, die es mappen soll. Das kann in der Hibernate config passieren oder in einer extra Datei -> Beitrag #2

                Be Spring müsste das so erfolgen:


                <bean id="sessionFactory"
                ....



                <property name="annotatedClasses">
                <list>
                <value>PACKAGE ZU DEINER KLASSE UND KLASSENAME bsp. de.meineanwendung.Klasse1</value>
                ...
                </list>
                /property>
                Christian

                Comment


                • #9
                  Ja stimmt, ich benutze Spring. Sorry, hätte ich erwähnen sollen.
                  Das mapping kann doch auch automatisch erfolgen, oder? Aso, da habe ich das in der Doku gelesen:
                  Code:
                  <property name="packagesToScan"     value="XXX.xxxx.xxxx.xxxx" />
                  Das habe ich in meiner Config ergänzt, und schau an, man kommt weiter, wenn auch noch nicht ans Ziel:
                  Code:
                  INFO:   15:57:15,833 DEBUG SQL:401 - 
                      select
                          this_.ID as ID0_0_,
                          this_.AUTHORITY as AUTHORITY0_0_,
                          this_.ENABLED as ENABLED0_0_,
                          this_.PASSWORD as PASSWORD0_0_,
                          this_.USERNAME as USERNAME0_0_ 
                      from
                          USER this_
                  INFO:   Hibernate: 
                      select
                          this_.ID as ID0_0_,
                          this_.AUTHORITY as AUTHORITY0_0_,
                          this_.ENABLED as ENABLED0_0_,
                          this_.PASSWORD as PASSWORD0_0_,
                          this_.USERNAME as USERNAME0_0_ 
                      from
                          USER this_
                  INFO:   15:57:16,044 DEBUG AbstractBatcher:374 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
                  INFO:   15:57:16,060 DEBUG JDBCExceptionReporter:69 - could not execute query [select this_.ID as ID0_0_, this_.AUTHORITY as AUTHORITY0_0_, this_.ENABLED as ENABLED0_0_, this_.PASSWORD as PASSWORD0_0_, this_.USERNAME as USERNAME0_0_ from USER this_]
                  java.sql.SQLException: Falsche Syntax in der Nähe des USER-Schlüsselworts.
                  	at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
                  	at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988)
                  	at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421)
                  	at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671)
                  	at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:505)
                  	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:1029)
                  	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
                  	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
                  ...

                  Die Datenbank ist eine MS SQL Express Geschichte (leider, nicht meine Wahl ). Den hibernate Dialekt habe ich gesetzt. Müsste nicht irgendwo das MS dbo Schmema auftauchen?

                  Comment


                  • #10
                    Ev. hast du einen Spaltennamen gewählt, der reserviert ist; ein Schlüsselwort
                    Christian

                    Comment


                    • #11
                      Laut MS Support Seiten wären dies Spaltennamen welche CA enthalten. Habe ich aber nicht (USERNAME, PASSWORD, ENABLED, ID, AUTHORITY). MS sagt, man soll nen Patch einspielen, oder die Queries nach dieser Anweisung umbauen:
                      Code:
                      PROBLEMUMGEHUNG
                      Gehen Sie folgendermaßen vor, um dieses Problem zu umgehen: 
                      Enthalten Sie wenn möglich, die Namen der Spalten nicht in der SQL-Anweisung. Z. B. statt der Syntax wie: 
                      Insert into CATest (CA) values (?)
                       verwenden Sie die folgenden: 
                      Insert into CATest values (?, ?, ...)
                      Kann ich hibernate dazu bringen??? Liegt es daran, weil es ein Prepared Statement ist? Eigentlich habe ich ja wie gesagt keine CA Namen in meiner Tabelle??? (http://support.microsoft.com/kb/273813/de)

                      Comment


                      • #12
                        Deine Tabelle heisst User.Das ist definitv ein Schlüsselwort
                        Christian

                        Comment


                        • #13
                          Wow, das wußte ich nicht. Super, die Tabelle umbenannt und schon tut es. Ich danke vielmals den Forumsgott. Hast mir mal wieder meine Sorgen vertrieben. Ich denke mal, bald habe ich neue. Vielen, riesen Dank!!!

                          Comment


                          • #14
                            gut, das es geklappt hat
                            Christian

                            Comment

                            Working...
                            X