Hibernate一对一关系用注解解决

用注解代替.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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值