使用Struts 2中的数据库值填充Dropdownlist,Hibernate

时间:2013-09-21 12:38:04

标签: java hibernate jsp orm struts2

我正在尝试使用表中的值填充下拉列表。该页面使用strust2和hibernate来访问数据库。

我可以查看注册页面(其中包含必须填充数据库值的下拉列表) 但下拉列表中没有显示任何值。

的index.jsp

  <s:url id="url" action="registerAction">

  </s:url>
  <s:a href="%{url}">Register</s:a>

register.jsp

 <s:form action="registerAction">
    <s:select label="Select Date of Month" name="months" headerKey="0" headerValue="--Select--"
                      list="allMonths" listKey="id" listValue="name"/>
    <s:submit value="Register"/>

 </s:form>

struts.xml中

<action name="registerAction" class="action.RegisterAction" method="populateSelect">
       <result name="none">register.jsp</result>
</action>

月份模型

@Entity
@Table(name="tbl_mnth")
public class Month {
    @Id
    @GeneratedValue
    @Column(name="mnth_id")
    private int id;
    @Column(name="mnth_name")
    private String name;

    public Month(){}

    public Month(String name) {
        this.name=name;
    }

    public String getName() {
        return name;
    }
}

DAO

public class UserDao {

 List<Month> allMonths = new ArrayList<Month>();
public List<Month> getAllMonths() {
        return allMonths;
    }

    public void setAllMonths(List<Month> allMonths) {
        this.allMonths = allMonths;
    }

    public Session getSession() {
        return HibernateUtil.getSession();
    }

    public void closeSession() {
        HibernateUtil.closeSession();
    }

    public UserDao() {
    }

    public List<Month> getMonths() {
        Session session = getSession();
        Transaction t = session.beginTransaction();
        allMonths = (List<Month>) session.createQuery("FROM Month").list();
        System.out.println("In constructor " + allMonths);
        t.commit();
        closeSession();
        return allMonths;
    }
}

行动类

public class RegisterAction extends ActionSupport {
List<Month> allMonths = new ArrayList<Month>();
String months;
UserDao udao = new UserDao();

public List<Month> getAllMonths() {
        return allMonths;
    }

    public void setAllMonths(List<Month> allMonths) {
        this.allMonths = allMonths;
    }
    public String getMonths() {
        return months;
    }

    public void setMonths(String months) {
        this.months = months;
    }
    public String populateSelect() {
        allMonths = udao.getMonths();
        System.out.println("In constructor " + allMonths);
        return "none";
    }
    public RegisterAction() {}
}

数据库表格为tbl_mnth,其中包含字段mnth_idmnth_name

我从中猜到的是动作类没有被实例化。我不知道它是如何或为何没有被实例化。

在服务器日志中显示

org.hibernate.hql.ast.QuerySyntaxException: Month is not mapped [from Month]

2 个答案:

答案 0 :(得分:1)

Hibernate是一个ORM(Object-Relational- Mapping )框架,用于将POJO映射到数据库模式。在你的情况下它是Month。并且因为您正在使用注释将对象映射到表,所以您应该在hibernate.cfg.xml

中对其进行配置
<mapping class="package.to.persistence.Month" />

没有映射类,Hibernate无法在对象中找到注释。

答案 1 :(得分:0)

尝试在DAO中执行此操作

public List<Month> getMonths() {
    Session session = getSession();
    Transaction t = session.beginTransaction();
    allMonths = (List<Month>) session.createCriteria(Month.class).list();
    System.out.println("In constructor " + allMonths);
    t.commit();
    closeSession();
    return allMonths;
}

顺便说一句,它与你的动作类没有任何关系,因为异常显然是一个hibernate异常。尝试在操作类中设置断点(如果使用的是IDE),或者输入System.out.println语句以查看您的代码是否正在进入操作类。