Hibernate一对一关系用注解解决

来源:互联网 发布:学生背包品牌知乎 编辑:程序博客网 时间:2024/06/07 17:31

用注解代替.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的映射类名@Entitypublic 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})@PrimaryKeyJoinColumnpublic 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;}@Overridepublic 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的映射类名@Entitypublic 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;}@Overridepublic 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 {@Overridepublic 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;}@Overridepublic 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();}}@Overridepublic 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;}@Overridepublic 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();}}@Overridepublic 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;}//重建sessionFactoryprivate static void rebuildSessionFactory() {config.configure();ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();sessionFactory=config.buildSessionFactory(serviceRegistry);}//关闭sessionpublic 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}" onclick="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>