2010-07-08 121 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> 

希望这有助于:)