2010-07-08 63 views
3

我是新來的休眠,我有一些麻煩的命名查詢註釋。我的代碼如下,並或多或少的NetBeansHibernate的命名查詢的問題

的BasicUser類生成:在這裏我嘗試使用

<?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> 

這就是:

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() { 
     } 
... 

而hibernate.cfg.xml文件查詢:

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; 

    } 

據我瞭解,我不必做任何映射xml的這個信息重刑是在註釋中。

我很感激任何幫助。預先感謝您:)

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> 

和太陽-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> 

回答

3

你命名查詢的名字真的是它的name,沒有它的前綴當致電getNamedQuery

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

順便說一下,由於您使用的是JPA annota您應該傾向於通過Hibernate API使用JPA API(即JPA的EntityManager優於Hibernate的Session)。

+0

現在我已經做了,你說什麼,使用的EntityManager而不是會議。現在我收到以下錯誤: 08-07-2010 16:49:25 org.hibernate.connection.DatasourceConnectionProvider configure 嚴重:找不到數據源:coffeee javax.naming。NoInitialContextException:需要在環境或系統屬性或applet參數或應用程序資源文件中指定類名:java.naming.factory.initial – AnAmuser 2010-07-08 14:54:39

+0

@AnAmuser:您是否在GlassFish內部運行此代碼?如果你不是,我想你需要提供一個'jndi.properties'文件和適當的參數,參見[這個以前的答案](http://stackoverflow.com/questions/2759300/how-to-set-up -jndi-屬性換數據存儲/ 2759542#2759542)。但這是一個非常不同的問題,我不能在評論框中提到。如果你是,應該設置最初的工廠。但正如我所說的,這實際上是一個不同的問題。爲清晰起見,你應該開一個新的問題(一個問題=一個問題)。 – 2010-07-08 15:41:56

0

如果你是如何設置JPA的EntityManager的方式想知道,看到這一點:

<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> 

有你的豆子後,可以選擇使用註釋,以獲得JpaTransactionManager接口,並使用獲得的EntityManagerFactory和使用工廠,讓您的EntityManager,然後你可以創建查詢/命名query..etc

某處你的類成員屬性的頂部,使用自動裝配的transactionManager的以下內容:

@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; 
    } 

對這個職位的頂部的豆是指某些屬性在屬性文件,所以請確保您有hibernate.properites與值文件象下面這樣:

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 

對於豆成功地創建你需要hibernate-jpa jar,你可能還需要hibernate validator jar。如果您正在使用Maven來管理你的項目依賴使用這些依賴關係:

<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> 

希望這有助於:)