问题
i want to integrate Struts with Hibernate. I am new to these technologies.
Infortunately i get badly stuck in these for last 4 days and my table is not able to get mapped. Please help. I am working on netbeans 7.1.2. i have created database on derby (Java DB). and i created few tables in it.
In my Java EE simple project which simply need to fetch whole data from database and display on the JSP page.
Here is My files :
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>example/HelloWorld.jsp</welcome-file>
</welcome-file-list>
</web-app>
Helloworld.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<table>
<tr>
<th>CNAME</th>
<th>BODY</th>
</tr>
<s:iterator value="questionList" var="question">
<tr>
<td><s:property value="cname"/></td>
<td><s:property value="body"/></td>
</tr>
</s:iterator>
</table>
</body>
</html>
example.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="example" namespace="/example" extends="struts-default">
<action name="HelloWorld" class="example.HelloWorld">
<result>/example/HelloWorld.jsp</result>
</action>
</package>
</struts>
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.DerbyDialect</property>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/Q4U</property>
<property name="hibernate.connection.username">rambo</property>
<property name="hibernate.connection.password">**</property>
<mapping resource="hibernate.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="beans.Question" table="QUESTION">
<!-- <id name="qid" type="java.lang.Integer">
<column name="QID" />
<generator class="increment" />
</id>
<property name="opc" type="java.lang.Integer">
<column name="OPC" not-null="true"/>
</property>
<property name="uid" type="java.lang.Integer">
<column name="UID" not-null="true"/>
</property>
<property name="cid" type="java.lang.Integer">
<column name="CID" not-null="true"/>
</property>
<property name="abuse" type="java.lang.Integer">
<column name="ABUSE" not-null="true"/>
</property>
<property name="accuracy" type="java.lang.Float">
<column name="ACCURACY" not-null="true"/>
</property>
<property name="poston" type="java.util.Date">
<column name="POSTON" not-null="true"/>
</property>
<property name="body" type="java.lang.String">
<column name="BODY" not-null="true"/>
</property>
<property name="op1" type="java.lang.String">
<column name="OP1" not-null="true"/>
</property>
<property name="op2" type="java.lang.String">
<column name="OP2" not-null="true"/>
</property>
<property name="op3" type="java.lang.String">
<column name="OP4" not-null="true"/>
</property>
<property name="op4" type="java.lang.String">
<column name="OP4" not-null="true"/>
</property>
<property name="op5" type="java.lang.String">
<column name="OP5" not-null="true"/>
</property>
<property name="cname" type="java.lang.String">
<column name="CNAME" not-null="true"/>
</property> -->
</class>
</hibernate-mapping>
Hibernate.reverse.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
<schema-selection match-schema="RAMBO"/>
<table-filter match-name="TESTS"/>
<table-filter match-name="USERS"/>
<table-filter match-name="QUESTION"/>
<table-filter match-name="INBOX"/>
<table-filter match-name="ADMIN"/>
<table-filter match-name="CATEGORY"/>
</hibernate-reverse-engineering>
struts.xml:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="example.xml"/>
<!-- Configuration for the default package. -->
<package name="default" extends="struts-default">
</package>
</struts>
Question.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package beans;
import java.util.Date;
import java.io.Serializable;
import javax.persistence.*;
/**
*
* @author ROMO
*/
@Entity
@Table (name="QUESTION")
public class Question implements Serializable {
int qid, opc, uid, cid, abuse;
float accuracy;
Date poston;
String body, op1, op2, op3, op4, op5, cname;
@Column(name="CNAME")
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Column(name="ABUSE")
public int getAbuse() {
return abuse;
}
public void setAbuse(int abuse) {
this.abuse = abuse;
}
@Column(name="ACCURACY")
public float getAccuracy() {
return accuracy;
}
public void setAccuracy(float accuracy) {
this.accuracy = accuracy;
}
@Column(name="BODY")
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
@Column(name="CID")
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
@Column(name="OP1")
public String getOp1() {
return op1;
}
public void setOp1(String op1) {
this.op1 = op1;
}
@Column(name="OP2")
public String getOp2() {
return op2;
}
public void setOp2(String op2) {
this.op2 = op2;
}
@Column(name="OP3")
public String getOp3() {
return op3;
}
public void setOp3(String op3) {
this.op3 = op3;
}
@Column(name="OP4")
public String getOp4() {
return op4;
}
public void setOp4(String op4) {
this.op4 = op4;
}
@Column(name="OP5")
public String getOp5() {
return op5;
}
public void setOp5(String op5) {
this.op5 = op5;
}
@Column(name="OPC")
public int getOpc() {
return opc;
}
public void setOpc(int opc) {
this.opc = opc;
}
@Column(name="POSTON")
@Temporal(javax.persistence.TemporalType.DATE)
public Date getPoston() {
return poston;
}
public void setPoston(Date poston) {
this.poston = poston;
}
@Id
@GeneratedValue
@Column(name="QID")
public int getQid() {
return qid;
}
public void setQid(int qid) {
this.qid = qid;
}
@Column(name="UID")
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
}
HelloWorld.java
/*
* $Id: HelloWorld.template,v 1.2 2008-03-27 05:47:21 ub3rsold4t Exp $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package example;
import java.util.List;
import beans.Question;
import com.opensymphony.xwork2.ActionSupport;
/**
* <code>Set welcome message.</code>
*/
public class HelloWorld extends ActionSupport {
private Question question;
private List<Question> questionList;
private HiberTest hiberTest;
public String execute() throws Exception {
this.questionList = hiberTest.list();
System.out.println("execute called");
setMessage(getText(MESSAGE));
return SUCCESS;
}
/**
* Provide default valuie for Message property.
*/
public static final String MESSAGE = "HelloWorld.message";
/**
* Field for Message property.
*/
private String message;
/**
* Return Message property.
*
* @return Message property
*/
public String getMessage() {
return message;
}
/**
* Set Message property.
*
* @param message Text to display on HelloWorld page.
*/
public void setMessage(String message) {
this.message = message;
}
}
HiberTest.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package example;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.classic.Session;
import beans.Question;
public class HiberTest extends HibernateUtil {
public List<Question> list() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<Question> contacts = null;
try {
contacts = (List<Question>)session.createQuery("from QUESTION").list();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}
session.getTransaction().commit();
return contacts;
}
}
HibernateUtil.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package example;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
/**
* Hibernate Utility class with a convenient method to get Session Factory
* object.
*
* @author ROMO
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Thats it. When i run the project, it run, but it doesn't show any data of database. Further When i right click on file Hibernate.cfg.xml and select 'Run HQL Query' and run my query : 'from QUESTION', I get the following error:
org.hibernate.hql.ast.QuerySyntaxException: QUESTION is not mapped [from QUESTION] at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158) at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87) at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70) at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255) at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056) at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945) at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688) at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544) at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281) at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229) at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111) at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:77) at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:56) at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
Please Please Please help me out. Its a simple application to display data of database on the browser in Integrated struts and Hibernate.
回答1:
In HQL queries you use logical entity names, not table names, and they are case sensitive:
contacts = (List<Question>)session.createQuery("from Question").list();
来源:https://stackoverflow.com/questions/11341878/got-badly-stuck-in-integrating-struts2-with-hibernate