用注解代替.hbm.xml文件,注解写在实体类中
主表:Driver1.java
package com.mingde.po;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
//定义实体类映射,代表定义一个默认为Drivers的映射类名
@Entity
public class Driver1 {
private int driverid;
private String drivername;
private String drivertype;
private String driverno;
private int driveryear;
private String status;
private Vehicle vehicle;
public Driver1() {
super();
}
public Driver1(int driverid, String drivername, String drivertype, String driverno, int driveryear, String status) {
super();
this.driverid = driverid;
this.drivername = drivername;
this.drivertype = drivertype;
this.driverno = driverno;
this.driveryear = driveryear;
this.status = status;
}
@OneToOne(fetch=FetchType.EAGER)//FetchType.EAGER代表立即加载
@Cascade({CascadeType.ALL})
@PrimaryKeyJoinColumn
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
@Id
@GeneratedValue(generator="a",strategy=GenerationType.SEQUENCE)//使用下面定义的序列值
@SequenceGenerator(name="a",allocationSize=1,initialValue=1,sequenceName="sequ_classes") //定义序列来自于数据库sequ_classes
//上面的allocationSize对应增长值,initialValue对应数据库该序列的初始值
public int getDriverid() {
return driverid;
}
public void setDriverid(int driverid) {
this.driverid = driverid;
}
public String getDrivername() {
return drivername;
}
public void setDrivername(String drivername) {
this.drivername = drivername;
}
public String getDrivertype() {
return drivertype;
}
public void setDrivertype(String drivertype) {
this.drivertype = drivertype;
}
public String getDriverno() {
return driverno;
}
public void setDriverno(String driverno) {
this.driverno = driverno;
}
public int getDriveryear() {
return driveryear;
}
public void setDriveryear(int driveryear) {
this.driveryear = driveryear;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String toString() {
return "Driver [driverid=" + driverid + ", drivername=" + drivername + ", drivertype=" + drivertype
+ ", driverno=" + driverno + ", driveryear=" + driveryear + ", status=" + status + "]";
}
}
从表:Vehicle.java
package com.mingde.po;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
//定义实体类映射,代表定义一个默认为Drivers的映射类名
@Entity
public class Vehicle {
private int cid;
private String carno;
private String cartype;
private float cartons;
private int caryears;
private Driver1 driver;
public Vehicle() {
super();
}
public Vehicle(int cid, String carno, String cartype, float cartons, int caryears) {
super();
this.cid = cid;
this.carno = carno;
this.cartype = cartype;
this.cartons = cartons;
this.caryears = caryears;
}
@OneToOne(mappedBy="vehicle")//配对一对一映射,mappeBy="vehicle"代表此表是从表,
//关系由对方Driver表来维护,所以Driver有主控制权,这是最重要的
public Driver1 getDriver() {
return driver;
}
public void setDriver(Driver1 driver) {
this.driver = driver;
}
@Id
//定义当前表的主键以外键方式生成,使用的是属性为driver的表的主键
@GenericGenerator(name="s",strategy="foreign",parameters={@Parameter(name="property",value="driver")})
@GeneratedValue(generator="s")//使用了上面表定义的主键生成策略
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCarno() {
return carno;
}
public void setCarno(String carno) {
this.carno = carno;
}
public String getCartype() {
return cartype;
}
public void setCartype(String cartype) {
this.cartype = cartype;
}
public float getCartons() {
return cartons;
}
public void setCartons(float cartons) {
this.cartons = cartons;
}
public int getCaryears() {
return caryears;
}
public void setCaryears(int caryears) {
this.caryears = caryears;
}
@Override
public String toString() {
return "Vehicle [cid=" + cid + ", carno=" + carno + ", cartype=" + cartype + ", cartons=" + cartons
+ ", caryears=" + caryears + "]";
}
}
hibernate.cfg.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping class="com.mingde.po.Driver1"/>
<mapping class="com.mingde.po.Vehicle"/>
</session-factory>
</hibernate-configuration>
最主要的就是以上的配置,其下的跟之前一模一样的
struts.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping class="com.mingde.po.Driver1"/>
<mapping class="com.mingde.po.Vehicle"/>
</session-factory>
</hibernate-configuration>
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Hibernate017_OneToOne_ZuJie</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
dao层
IBaseDao接口
package com.mingde.dao;
import java.util.List;
public interface IBaseDao {
List findAll(String hql);
void add(Object obj);
Object findObjectById(Class<?> class1, int sid);
void update(Object obj);
void del(Object obj);
}
BaseDaoImpl实现类
package com.mingde.dao.impl;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.mingde.dao.IBaseDao;
import com.mingde.utils.HibernateSessionFactory;
public class BaseDaoImpl implements IBaseDao {
@Override
public List findAll(String hql) {
List list=null;
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
list=session.createQuery(hql).list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateSessionFactory.closeSessionFactory();
}
return list;
}
@Override
public void add(Object obj) {
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
session.save(obj);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateSessionFactory.closeSessionFactory();
}
}
@Override
public Object findObjectById(Class<?> class1, int id) {
Object obj=null;
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
obj=session.get(class1, id);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateSessionFactory.closeSessionFactory();
}
return obj;
}
@Override
public void update(Object obj) {
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
session.merge(obj);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateSessionFactory.closeSessionFactory();
}
}
@Override
public void del(Object obj) {
Session session=HibernateSessionFactory.getSession();
Transaction tx=null;
try {
tx=session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateSessionFactory.closeSessionFactory();
}
}
}
Action类
package com.mingde.action;
import java.util.ArrayList;
import java.util.List;
import com.mingde.dao.IBaseDao;
import com.mingde.dao.impl.BaseDaoImpl;
import com.mingde.po.Driver1;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class DAction extends ActionSupport {
private IBaseDao bd=new BaseDaoImpl();
private List<Driver1> dlist=new ArrayList<>();
private Driver1 d=new Driver1();
//显示
public String list()throws Exception{
dlist=bd.findAll("from Driver1");
return "list";
}
//到添加页面
public String toAdd()throws Exception{
return "toAdd";
}
//到添加页面
public String add()throws Exception{
d.getVehicle().setDriver(d); //交代一对一关联关系
bd.add(d);
return "to_list";
}
//到修改页面
public String toUpdate()throws Exception{
d=(Driver1) bd.findObjectById(d.getClass(), d.getDriverid());
return "toUpdate";
}
//修改
public String update()throws Exception{
d.getVehicle().setDriver(d);
bd.update(d);
return "to_list";
}
//删除
public String del()throws Exception{
d=(Driver1) bd.findObjectById(d.getClass(), d.getDriverid());
bd.del(d);
return "to_list";
}
//
public List<Driver1> getDlist() {
return dlist;
}
public Driver1 getD() {
return d;
}
public void setD(Driver1 d) {
this.d = d;
}
public void setDlist(List<Driver1> dlist) {
this.dlist = dlist;
}
}
utils包的HibernateSessionFactory.java
package com.mingde.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateSessionFactory {
private static SessionFactory sessionFactory;
private static Configuration config=new Configuration();
private static ThreadLocal<Session> threadLocal =new ThreadLocal<>();
static{
config.configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory =config.buildSessionFactory(serviceRegistry);
}
//获取session方法
public static Session getSession(){
Session session = threadLocal.get();
if(session==null || !session.isOpen()){
if(sessionFactory==null){
rebuildSessionFactory();
}
}
session=(sessionFactory!=null)?sessionFactory.openSession():null;
threadLocal.set(session);
return session;
}
//重建sessionFactory
private static void rebuildSessionFactory() {
config.configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory=config.buildSessionFactory(serviceRegistry);
}
//关闭session
public static void closeSessionFactory(){
Session session = threadLocal.get();
threadLocal.set(null);
if(session!=null)session.close();
}
}
JSP页面
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>列表</h2>
<table width=800 align="center" border=1 cellspacing=0 rules="all">
<tr>
<td colspan=11><a href="d_toAdd">添加</a></td>
</tr>
<tr>
<th>编号</th><th>姓名</th><th>驾照类型</th>
<th>驾照号码</th><th>驾龄</th><th>当前状态</th>
<th>车牌</th><th>车型</th><th>载重(吨)</th>
<th>车龄</th><th>操作</th>
</tr>
<s:iterator value="dlist" >
<tr align="center">
<td><s:property value="driverid" /></td>
<td><s:property value="drivername" /></td>
<td><s:property value="drivertype" /></td>
<td><s:property value="driverno" /></td>
<td><s:property value="driveryear" /></td>
<td><s:property value="status" /></td>
<td><s:property value="vehicle.carno" /></td>
<td><s:property value="vehicle.cartype" /></td>
<td><s:property value="vehicle.cartons" /></td>
<td><s:property value="vehicle.caryears" /></td>
<td>
<s:a href="d_toUpdate?d.driverid=%{driverid}">修改</s:a>
<s:a href="d_del?d.driverid=%{driverid}" οnclick="return confirm('确定删除?')">删除</s:a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>
toAdd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>添加</h2>
<s:form action="d_add">
<s:textfield name="d.drivername" label="姓名"></s:textfield>
<s:select name="d.drivertype" label="驾照类型" list="#{'A':'A','B':'B','C':'C' }" value="'A'"></s:select>
<s:textfield name="d.driverno" label="驾照号码"></s:textfield>
<s:textfield name="d.driveryear" label="驾龄" value=''></s:textfield>
<s:radio name="d.status" list="#{'D':'机动','F':'休假' }" value="'D'" label="当前状态"></s:radio>
<s:textfield name="d.vehicle.carno" label="车牌"></s:textfield>
<s:textfield name="d.vehicle.cartype" label="车型"></s:textfield>
<s:textfield name="d.vehicle.cartons" label="载重(吨)"></s:textfield>
<s:textfield name="d.vehicle.caryears" label="车龄"></s:textfield>
<s:submit value="添加"></s:submit>
</s:form>
</body>
</html>
toUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>修改</h2>
<s:form action="d_update">
<s:hidden name="d.driverid" />
<s:hidden name="d.vehicle.cid" />
<s:textfield name="d.drivername" label="姓名"></s:textfield>
<s:select name="d.drivertype" label="驾照类型" list="#{'A':'A','B':'B','C':'C' }" ></s:select>
<s:textfield name="d.driverno" label="驾照号码"></s:textfield>
<s:textfield name="d.driveryear" label="驾龄"></s:textfield>
<s:radio name="d.status" list="#{'D':'机动','F':'休假' }" value="'D'" label="当前状态"></s:radio>
<s:textfield name="d.vehicle.carno" label="车牌"></s:textfield>
<s:textfield name="d.vehicle.cartype" label="车型"></s:textfield>
<s:textfield name="d.vehicle.cartons" label="载重(吨)"></s:textfield>
<s:textfield name="d.vehicle.caryears" label="车龄"></s:textfield>
<s:submit value="修改"></s:submit>
</s:form>
</body>
</html>