Hibernate(Hibernate)

优质
小牛编辑
126浏览
2023-12-01

在本章中,我们将讨论BeanEditFormGrid component与Hibernate的集成。 Hibernate通过hibernate模块集成到tapestry中。 要启用hibernate模块,请在pom.xml文件中添加tapestry-hibernate依赖项和可选的hsqldb 。 现在,通过放置在资源文件夹根目录的hibernate.cfg.xml文件配置hibernate。

pom.xml (partial)

<dependency> 
   <groupId>org.apache.tapestry</groupId> 
   <artifactId>tapestry-hibernate</artifactId> 
   <version>${tapestry-release-version}</version> 
</dependency>  
<dependency> 
   <groupId>org.hsqldb</groupId> 
   <artifactId>hsqldb</artifactId> 
   <version>2.3.2</version> 
</dependency>

Hibernate.cfg.xml

<!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.connection.driver_class">
         org.hsqldb.jdbcDriver
      </property> 
      <property name = "hibernate.connection.url">
         jdbc:hsqldb:./target/work/sampleapp;shutdown = true
      </property> 
      <property name = "hibernate.dialect">
         org.hibernate.dialect.HSQLDialect
      </property> 
      <property name = "hibernate.connection.username">sa</property> 
      <property name = "hibernate.connection.password"></property> 
      <property name = "hbm2ddl.auto">update</property>
      <property name = "hibernate.show_sql">true</property> 
      <property name = "hibernate.format_sql">true</property> 
   </session-factory> 
</hibernate-configuration> 

让我们看看如何使用Bean组件创建employee add page使用BeanEditForm组件和employee list page 。 持久层由Hibernate模块处理。

创建一个员工类并使用@Entity注释进行装饰。 然后,为相关字段添加验证注释,并为id字段添加hibernate相关注释@Id和@GeneratedValue。 另外,将性别设置为枚举类型。

Employee.java

package com.example.MyFirstApplication.entities;  
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id;  
import org.apache.tapestry5.beaneditor.NonVisual; 
import org.apache.tapestry5.beaneditor.Validate;  
@Entity 
public class Employee {  
   @Id 
   @GeneratedValue(strategy = GenerationType.IDENTITY) 
   @NonVisual 
   public Long id;  
   @Validate("required") 
   public String firstName;  
   @Validate("required") 
   public String lastName; 
   @Validate("required") 
   public String userName;  
   @Validate("required") 
   public String password;  
   @Validate("required") 
   public String email;  
   public String phone;  
   @Validate("required") 
   public String Street;  
   @Validate("required") 
   public String city;  
   @Validate("required") 
   public String state;  
   @Validate("required,regexp=^\\d{5}(-\\d{4})?$") 
   public String zip; 
} 
Gender.java (enum)  
package com.example.MyFirstApplication.data;  
public enum Gender { 
   Male, Female 
}

在页面下的新文件夹employee中创建员工列表页面ListEmployee.java ,在/src/main/resources/pages/employee文件夹中创建相应的模板文件ListEmployee.tml。 Tapestry通过删除重复数据为子文件夹提供短URL。

例如,ListEmployee页面可以通过普通URL(/ employee/listemployee)和短URL(/ employee/list)访问。

使用@Inject批注将Hibernate会话注入列表页面。 在列表页面中定义属性getEmployees ,并使用注入的会话对象向员工填充它。 完成员工类的代码,如下所示。

ListEmployee.java

package com.example.MyFirstApplication.pages.employee;  
import java.util.List;  
import org.apache.tapestry5.annotations.Import; 
import org.apache.tapestry5.ioc.annotations.Inject;  
import org.hibernate.Session; 
import com.example.MyFirstApplication.entities.Employee; 
import org.apache.tapestry5.annotations.Import;  
@Import(stylesheet="context:mybootstrap/css/bootstrap.css") 
public class ListEmployee { 
   @Inject 
   private Session session; 
   public List<Employee> getEmployees() { 
      return session.createCriteria(Employee.class).list(); 
   } 
} 

为ListEmployee类创建模板文件。 该模板将有两个主要组件,分别是 -

  • PageLink - 创建员工链接页面。

  • Grid - 用于呈现员工详细信息。 网格组件具有源属性以注入员工列表,并包括属性以包括要呈现的字段。

ListEmployee.tml(列出所有员工)

<html t:type = "simplelayout" title = "List Employee" 
   xmlns:t = "http://tapestry.apache.org/schema/tapestry_5_4.xsd"> 
   <h1>Employees</h1> 
   <ul> 
      <li><t:pagelink page = "employee/create">Create new employee</t:pagelink></li> 
   </ul>  
   <t:grid source = "employees" 
      include = "userName,firstName,lastName,gender,dateOfBirth,phone,city,state"/>  
</html>

创建员工创建模板文件并包含BeanEditForm组件。 该组件具有以下属性 -

  • object - 包括来源。

  • reorder - 定义要渲染的字段的顺序。

  • submitlabel - 表单提交按钮的消息

完整的编码如下 -

<html t:type = "simplelayout" title = "Create New Address" 
   xmlns:t = "http://tapestry.apache.org/schema/tapestry_5_4.xsd">  
   <t:beaneditform  
      object = "employee"  
      submitlabel = "message:submit-label" 
      reorder = "userName,password,firstName,lastName,
      dateOfBirth,gender,email,phone,s treet,city,state,zip" />  
</html> 

创建员工创建类并包括会话,员工属性,列表页面(导航链接)并定义组件的OnSuccess事件(更新数据的位置)。 会话数据使用hibernate会话持久保存到数据库中。

完整的编码如下 -

package com.example.MyFirstApplication.pages.employee;  
import com.example.MyFirstApplication.entities.Employee; 
import com.example.MyFirstApplication.pages.employee.ListEmployee; 
import org.apache.tapestry5.annotations.InjectPage; 
import org.apache.tapestry5.annotations.Property;  
import org.apache.tapestry5.hibernate.annotations.CommitAfter; 
import org.apache.tapestry5.ioc.annotations.Inject; 
import org.hibernate.Session;  
public class CreateEmployee { 
   @Property 
   private Employee employee;  
   @Inject 
   private Session session;  
   @InjectPage 
   private ListEmployee listPage;  
   @CommitAfter 
   Object onSuccess() { 
      session.persist(employee);  
      return listPage; 
   } 
}

添加CreateEmployee.properties文件并包含要在表单验证中使用的消息。 完整的代码如下 -

zip-regexp=^\\d{5}(-\\d{4})?$ 
zip-regexp-message = Zip Codes are five or nine digits. Example: 02134 or 901251655. 
submit-label = Create Employee 

员工创建页面和列表页面的屏幕截图如下所示 -

员工创造

创作页面