zoukankan      html  css  js  c++  java
  • hibernate主键生成策略

    创建2个实体类:

    Worker.java:

    package com.entity;
    
    public class Worker {
    
    	private String wid;
    	private String wname;
    	public String getWid() {
    		return wid;
    	}
    	public void setWid(String wid) {
    		this.wid = wid;
    	}
    	public String getWname() {
    		return wname;
    	}
    	public void setWname(String wname) {
    		this.wname = wname;
    	}
    	public Worker(String wid, String wname) {
    		super();
    		this.wid = wid;
    		this.wname = wname;
    	}
    	public Worker() {
    		super();
    	}
    	@Override
    	public String toString() {
    		return "Worker [wid=" + wid + ", wname=" + wname + "]";
    	}
    	
    	
    }
    

      Student.java:

    package com.entity;
    
    public class Student {
    
    	private Integer sid;
    	private String sname;
    	public Integer getSid() {
    		return sid;
    	}
    	public void setSid(Integer sid) {
    		this.sid = sid;
    	}
    	public String getSname() {
    		return sname;
    	}
    	public void setSname(String sname) {
    		this.sname = sname;
    	}
    	@Override
    	public String toString() {
    		return "Student [sid=" + sid + ", sname=" + sname + "]";
    	}
    	public Student(Integer sid, String sname) {
    		super();
    		this.sid = sid;
    		this.sname = sname;
    	}
    	public Student() {
    		super();
    	}
    	
    }
    

      在同包下放入Student.hbm.xml 和Worker.hbm.xml2个配置

    Student.hbm.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="com.entity.Student" table="t_hibernate_student">
    		<id name="sid" type="java.lang.Integer" column="sid">
    			<!-- <generator class="assigned" /> -->
    			<!-- <generator class="identity" /> -->
    			<!-- <generator class="increment" />  -->
    			<!-- <generator class="sequence" > <param name="sequence_name">aaa</param> 
    				</generator> -->
    		</id>
    		<property name="sname" type="java.lang.String" column="sname">
    		</property>
    	</class>
    </hibernate-mapping>
    

      Worker.hbm.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="com.entity.Worker" table="t_hibernate_worker">
    		<id name="wid" type="java.lang.String" column="wid">
    			<generator class="com.id.MyTsGenerator" />
    <!-- --> <!-- <generator class="sequence" /> --> <!-- <generator class="sequence" > <param name="sequence_name">aaa</param> </generator> --> </id> <property name="wname" type="java.lang.String" column="wname"> </property> </class> </hibernate-mapping>

      要用到的工具类:

    SessionFacyoryUtils:

    package com.util;
    
    /**
     * 仅在学习hibernate的工程中使用,进入spring的学习就用不到了,后面会有ssh替代
     * 作用:
     * 	用来检测hibernate中的配置文件的准确性
     * 			hibernate.cfg.xml
     * 			*.hbm.xml
     * @author xyls
     */
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class SessionFactoryUtils {
    	private static SessionFactory sessionFactory;
    	static {
    		Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
    		sessionFactory = cfg.buildSessionFactory();
    	}
    	
    	public static Session openSession() {
    		//从本地的线程中获取session会话,(第一次需要创建)
    		//第二次就能反复利用,节约性能
    		Session session = sessionFactory.getCurrentSession();
    		if(session == null) {
    			session = sessionFactory.openSession();
    		}
    		return session;
    	}
    	
    	public static void closeSession() {
    		Session session = sessionFactory.getCurrentSession();
    		if(session != null && session.isOpen()) {
    			session.close();
    		}
    	}
    	
    	public static void main(String[] args) {
    		Session session = SessionFactoryUtils.openSession();
    		session.beginTransaction();
    		System.out.println(session.isConnected());
    		SessionFactoryUtils.closeSession();
    		System.out.println(session.isConnected());
    	}
    }
    

      测试:

    DemoDao:

        package com.dao;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import com.entity.Student;
    import com.entity.Worker;
    import com.util.SessionFactoryUtils;
    /**
     * hibernate中的主键生成策略
     * 1、人工控制
     * 2、数据库控制
     * 3、hibernate控制
     * 4、自定义主键生成策略
     * @author xyls
     *
     */
    public class DemoDao {
    /**
     * 新增学生
     * @param stu
     */
    	public void add(Student stu) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transation=session.beginTransaction();
    		session.save(stu);
    		transation.commit();
    		SessionFactoryUtils.closeSession();
    	}
    	/**
    	 * 新增工人
    	 * @param worker
    	 */
    	public void addWorker(Worker worker) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transation=session.beginTransaction();
    		session.save(worker);
    		transation.commit();
    		SessionFactoryUtils.closeSession();
    	}
    	/**
    	 * 
    	 * @param args
    	 */
    	public static void testStudent() {
    		DemoDao dao=new DemoDao();
    		Student stu=new Student();
    		stu.setSname("柳长歌");
    		stu.setSid(97);
    		dao.add(stu);
    	}
    	public static void main(String[] args) {
    		DemoDao dao=new DemoDao();
    		Worker worker=new Worker();
    		worker.setWname("220");
    		dao.addWorker(worker);
    		
    	}
    }
    

      

    程序员自行控制:assigned(数据类型不限、保存前必须赋值)

    数据库控制:identity(标识列/自动增长、  数字,无需赋值)

     数据库控制:sequence(数字,无需赋值, 默认使hibernate_sequence这个序列,也可以通过sequence/sequence_name参数赋值

    hibernate控制:increment(数字,无需赋值)/uuid(32位的字符串,无需赋值,)

     自定义主键生成器

    建一个主键生成器类(实现org.hibernate.id.IdentifierGenerator接口):

    package com.id;
    
    import java.io.Serializable;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.hibernate.HibernateException;
    import org.hibernate.engine.spi.SharedSessionContractImplementor;
    import org.hibernate.id.IdentifierGenerator;
    
    public class MyTsGenerator implements IdentifierGenerator {
    
    	@Override
    	public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
    		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		
    		
    		return "book_order_"+sdf.format(new Date());
    	}
    
    }
    

      测试:

  • 相关阅读:
    android基础开发之scrollview
    java网络---再论URL & URI
    Android Studio 有用的插件
    java网络---查找Internet
    java网络---流
    Qt学习之路(1)------Qt常用类用法说明
    将批量下载的博客导入到手机后,通过豆约翰博客阅读器APP(Android手机)进行浏览,白字黑底,保护眼睛,图文并茂。
    如何收藏互联网上的任意网页到系统某个分类下,之后进行批量导出发布等---博客备份专家的博文收藏功能您不可不知
    很喜欢看某方面的文章,如何将不同站点,不同博主同一类别的文章归类整合到一起,再批量导出成各种格式---豆约翰博客备份专家新增按分类收藏博文功能
    豆约翰博客备份专家博客导出示例(PDF,CHM)
  • 原文地址:https://www.cnblogs.com/omji0030/p/11293764.html
Copyright © 2011-2022 走看看