2010-07-08 23 views
3

Je suis nouveau à hiberner et j'ai quelques problèmes avec l'annotation de requête nommée. Mon code est le suivant et est plus ou moins généré par NetBeansProblème avec la requête nommée d'hibernate

La classe BasicUser:

package wmc.model; 

    import java.io.Serializable; 
    import javax.persistence.Basic; 
    import javax.persistence.CascadeType; 
    import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.Id; 
    import javax.persistence.JoinColumn; 
    import javax.persistence.ManyToOne; 
    import org.hibernate.annotations.NamedQueries; 
    import org.hibernate.annotations.NamedQuery; 
    import javax.persistence.OneToOne; 
    import javax.persistence.Table; 

    @Entity 
    @Table(name = "basic_user") 
    @NamedQueries({ 
     @NamedQuery(name = "BasicUser.findAll", query = "SELECT b FROM BasicUser b"), 
     @NamedQuery(name = "BasicUser.findByFirstName", query = "SELECT b FROM BasicUser b WHERE b.firstName = :firstName"), 
     @NamedQuery(name = "BasicUser.findByLastName", query = "SELECT b FROM BasicUser b WHERE b.lastName = :lastName"), 
     @NamedQuery(name = "BasicUser.findByEmail", query = "SELECT b FROM BasicUser b WHERE b.email = :email"), 
     @NamedQuery(name = "BasicUser.findByPassword", query = "SELECT b FROM BasicUser b WHERE b.password = :password")}) 
    public class BasicUser implements Serializable { 
     private static final long serialVersionUID = 1L; 
     @Basic(optional = false) 
     @Column(name = "First_Name") 
     private String firstName; 
     @Basic(optional = false) 
     @Column(name = "Last_Name") 
     private String lastName; 
     @Id 
     @Basic(optional = false) 
     @Column(name = "Email") 
     private String email; 
     @Basic(optional = false) 
     @Column(name = "Password") 
     private String password; 
     @OneToOne(cascade = CascadeType.ALL, mappedBy = "basicUser") 
     private StatUser statUser; 
     @JoinColumn(name = "Group_Name", referencedColumnName = "Group_Name") 
     @ManyToOne(optional = false) 
     private Groups groupName; 

     public BasicUser() { 
     } 
... 

et le fichier hibernate.cfg.xml:

<?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.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://mysql.dinhost.net:3306/coffeedrinkers</property> 
    <property name="hibernate.connection.username">bla</property> 
    <property name="hibernate.connection.password">bla</property> 
    </session-factory> 
</hibernate-configuration> 

C'est là que j'essayer d'utiliser la requête:

public static boolean userExists(String email, String password) { 
     Session session = null; 

      try{ 

      SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

      session =sessionFactory.openSession(); 

      Object object = session.getNamedQuery("wmc.model.BasicUser.findByEmail"). 
        setString("email", email).uniqueResult(); 
      BasicUser user = (BasicUser) object; 

      if(user != null && user.getPassword().equals(password)) { 
       return true; 
      } 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
      } 

      return false; 

    } 

Si je comprends bien, je n'ai pas faire de xml cartographie de ce que Informa tion est dans les annotations.

J'apprécie toute aide. Merci d'avance :)

persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="WMCPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>coffeee</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

et le soleil resources.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd"> 
<resources> 
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_coffeedrinkers_AnAmuserPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> 
     <property name="serverName" value="mysql.dinhost.net"/> 
     <property name="portNumber" value="3306"/> 
     <property name="databaseName" value="coffeedrinkers"/> 
     <property name="User" value="bla"/> 
     <property name="Password" value="bla"/> 
     <property name="URL" value="jdbc:mysql://mysql.dinhost.net:3306/coffeedrinkers"/> 
     <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
    </jdbc-connection-pool> 
    <jdbc-resource enabled="true" pool-name="mysql_coffeedrinkers_AnAmuserPool" jndi-name="coffeee" object-type="user"/> 
</resources> 

Répondre

3

Le nom de vous nommé requête est vraiment son name, ne préfixe pas lorsque vous appelez getNamedQuery

BasicUser user = (BasicUser) session.getNamedQuery("BasicUser.findByEmail"). 
     setString("email", email).uniqueResult(); 

Par ailleurs, puisque vous utilisez JPA annota tions, vous devriez privilégier l'API JPA plutôt que l'API Hibernate (c.-à-d. EntityManager de JPA sur Session d'Hibernate).

+0

Maintenant, je l'ai fait ce que vous avez dit et utilisé EntityManager au lieu de session. Maintenant, je reçois l'erreur suivante: 08-07-2010 16:49:25 org.hibernate.connection.DatasourceConnectionProvider configurer SEVERE: Impossible de trouver la source de données: coffeee javax.naming.NoInitialContextException: Nécessité de spécifier le nom de la classe dans l'environnement ou la propriété système, ou en tant que paramètre d'applet, ou dans un fichier de ressources d'application: java.naming.factory.initial – AnAmuser

+0

@AnAmuser: Exécutez-vous ce code dans GlassFish? Si vous ne l'êtes pas, je suppose que vous devez fournir un fichier 'jndi.properties' avec les paramètres appropriés, voir [cette réponse précédente] (http://stackoverflow.com/questions/2759300/how-to-set-up -jndi-properties-for-datastore/2759542 # 2759542). Mais c'est une question très différente que je ne peux pas couvrir dans la boîte de commentaire. Si vous l'êtes, l'usine initiale doit être définie. Mais comme je l'ai dit, c'est vraiment un problème différent. Vous devriez ouvrir une nouvelle question par souci de clarté (une question = un problème). –

0

Si vous vous demandez sur les moyens de EntityManager de la façon de configurer JPA, voir ceci:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="emf"/> 

    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="jpaVendorAdapter"> 
      <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
        p:showSql="${hibernate.show_sql}"/> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      </props> 
     </property> 
     <property name="packagesToScan" value="com.books.web.entities"></property> 
     <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}"></property> 
     <property name="url" value="${jdbc.url}"></property> 
     <property name="username" value="${jdbc.username}"></property> 
     <property name="password" value="${jdbc.password}"></property> 
    </bean> 

Après avoir vos haricots, vous pouvez éventuellement annotation utiliser pour obtenir le JPATransactionManager et l'utiliser pour obtenir le EntityManagerFactory et l'utilisation l'usine pour obtenir votre EntityManager et vous pouvez créer votre requête/nom query..etc

Quelque part au-dessus de vos attributs membres de la classe, le transactionManager en utilisant lier automatiquement les éléments suivants:

@Autowired 
    private JpaTransactionManager transactionManager; 

public List<Book> findBookByCategory(String category){ 
     EntityManagerFactory entityManagerFactory = transactionManager.getEntityManagerFactory(); 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     entityManager.getTransaction().begin(); 
     List<Book> result = entityManager.createNamedQuery("Book.findByCategory", Book.class) 
           .setParameter("category", category) 
           .getResultList(); 
     entityManager.getTransaction().commit(); 
     entityManager.close(); 
     return result; 
    } 

Les fèves au-dessus de ce poste se réfèrent à certaines propriétés qui se trouvent dans un fichier de propriétés, alors assurez-vous hibernate.properites fichier avec des valeurs comme ci-dessous:

hibernate.dialect org.hibernate.dialect.MySQLDialect 
hibernate.show_sql true 
hibernate.hbm2ddl.auto update 
hibernate.generate_statistics true 
hibernate.connection.driver_class com.mysql.jdbc.Driver 
hibernate.connection.url jdbc:mysql://localhost:3306/foobardb?useUnicode=true&amp;createDatabaseIfNotExist=true&amp;characterEncoding=utf-8 
hibernate.connection.username put_user_name_here 
hibernate.connection.password put_password_here 
hibernate.connection.CharSet utf8 
hibernate.connection.characterEncoding utf8 
hibernate.connection.useUnicode true 

Pour les haricots à vous créé avec succès Vous avez besoin des fichiers hibernate-jpa jars, et vous aurez peut-être aussi besoin du fichier jar hibernate validator. Si vous utilisez Maven pour gérer les dépendances de votre projet utilisent ces dépendances:

<dependency> 
       <groupId>org.springframework.data</groupId> 
       <artifactId>spring-data-jpa</artifactId> 
       <version>${spring.data.jpa.version}</version> 
       <exclusions> 
        <exclusion> 
         <artifactId>junit-dep</artifactId> 
         <groupId>junit</groupId> 
        </exclusion> 
       </exclusions> 
      </dependency> 

<!-- JPA --> 
      <dependency> 
       <groupId>org.hibernate.javax.persistence</groupId> 
       <artifactId>hibernate-jpa-2.0-api</artifactId> 
       <version>1.0.1.Final</version> 
       <scope>compile</scope> 
      </dependency> 

      <dependency> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-core</artifactId> 
       <version>${hibernate.version}</version> 
      </dependency> 
         <dependency> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-entitymanager</artifactId> 
       <version>${hibernate.version}</version> 
      </dependency> 

<dependency> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-validator</artifactId> 
       <version>${hibernate-validator.version}</version> 
       <scope>compile</scope> 

       <exclusions> 
        <exclusion> 
         <groupId>javax.xml.bind</groupId> 
         <artifactId>jaxb-api</artifactId> 
        </exclusion> 
        <exclusion> 
         <groupId>com.sun.xml.bind</groupId> 
         <artifactId>jaxb-impl</artifactId> 
        </exclusion> 
       </exclusions> 
      </dependency> 

Hope this helps :)