HIbernate的写法总结

  • 普通表操作

    普通操作莫过于CRUD,建好表了之后对表的数据进行操作。详见代码。    

package package2;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateExecute {

    public static void main(String[] args) {
        HibernateController hc=new HibernateController();
        persion toadd=new persion();
        toadd.setId(6);
        toadd.setName("lkxj");
        hc.update(toadd);
    }

}
class HibernateUtil{
    private static SessionFactory ssf;
    static{
        Configuration cfg=new Configuration().configure();
        ssf=cfg.buildSessionFactory();
    }
    public static Session getSession(){
        Session session=ssf.openSession();
        return session;
    }
    public static void closeSession(Session session){
        session.close();
    }
}
class HibernateController implements DAOInterface{

    // 添加信息
    @Override
    public void add(persion p) {
        Session session=HibernateUtil.getSession();
        Transaction transaction=session.beginTransaction();
        try{
            session.save(p);
            transaction.commit();
        }catch (Exception e) {
            // TODO: handle exception
            transaction.rollback();
        }finally {
            HibernateUtil.closeSession(session);
        }
    }
    // 删除信息
    @Override
    public void delete(persion p) {
        // TODO Auto-generated method stub
        Session session=HibernateUtil.getSession();
        Transaction transaction=session.beginTransaction();
        try{
            session.delete(p);
            transaction.commit();
        }catch (Exception e) {
            // TODO: handle exception
            transaction.rollback();
        }finally {
            HibernateUtil.closeSession(session);
        }
    }
    // 搜寻信息
    @Override
    public persion search(int id) {
        // TODO Auto-generated method stub
        Session session=HibernateUtil.getSession();
        Transaction transaction=session.beginTransaction();
        persion p=null;
        try{
            p=(persion)session.get(persion.class, id);
            transaction.commit();
        }catch (Exception e) {
            // TODO: handle exception
            transaction.rollback();
        }finally {
            HibernateUtil.closeSession(session);
        }
        return p;
    }
    // 更新信息
    @Override
    public void update(persion p) {
        // TODO Auto-generated method stub
        Session session=HibernateUtil.getSession();
        Transaction transaction=session.beginTransaction();
        try{
            session.update(p);
            transaction.commit();
        }catch (Exception e) {
            // TODO: handle exception
            transaction.rollback();
        }finally {
            HibernateUtil.closeSession(session);
        }
    }

}

    bean类如下

package package2;

public class persion {
    int id;
    String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

    persion.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-7-20 15:57:35 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="package2.persion" table="PERSION">
        <id name="id" type="int">
            <column name="id" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" />
        </property>
    </class>
</hibernate-mapping>

    在hiberna.cfg.xml末尾添加一行

        <mapping resource="package2/persion.hbm.xml" />
  • 映射关系

    一对一映射:比如一个用户只有一个地址。实现的方式有两种,一,主键关联;二,外键关联。

    主键关联就是两个表的主键其中一个为另外一个表的外键。比如user表的主键,为address表的外键,这个address的外键正好就是它这个表的主键。user为主表,address为从表。address的外键引用的时user的主键。在下面的设计中,是user类为address的从表,user的生成策略为foreign,表示主键由关联类产生。

    User.java

package HibernateRelation;
//一个用户只有一个地址
public class User {
	private int userid;
	private String name;
	private String password;
	private Address address;
	public User(){

	}
	public User(String name,String password,Address address){
		this.name=name;
		this.password=password;
		this.address=address;

	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}

}

    Address.java

package HibernateRelation;

public class Address {
	private int addressid;
	private String addressinfo;
	public Address(int addressid,String addressinfo){
		this.addressid=addressid;
		this.addressinfo=addressinfo;
	}
	public Address(){

	}
	public int getAddressid() {
		return addressid;
	}
	public void setAddressid(int addressid) {
		this.addressid = addressid;
	}
	public String getAddressinfo() {
		return addressinfo;
	}
	public void setAddressinfo(String addressinfo) {
		this.addressinfo = addressinfo;
	}

}

    User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 14:48:03 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.User" table="USER">
        <id name="userid" type="int" access="field">
            <column name="USERID" />
            <!--由关联类来生成主键 -->
            <generator class="foreign" >
                <param name="property">address</param>
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <!--基于主键的一对一映射-->
        <one-to-one name="address" class="HibernateRelation.Address" constrained="true">
        </one-to-one>
    </class>
</hibernate-mapping>

    Address.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 14:48:03 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.Address" table="ADDRESS">
        <id name="addressid" type="int" access="field">
            <column name="ADDRESSID" />
            <generator class="identity" /><!--主键生成策略-->
        </id>
        <property name="addressinfo" type="java.lang.String">
            <column name="ADDRESSINFO" />
        </property>
    </class>
</hibernate-mapping>

    惯例,在总配置文件中添加映射,和自动建表配置。

<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="HibernateRelation/User.hbm.xml" />
<mapping resource="HibernateRelation/Address.hbm.xml" />

    在这里可以先建表,也可以不用建表,表结构和你写的类关系类似。遇到一个错误,在one-to-one的标签里添加了column这个属性,会导致一个异常。因为是工具自动产生的。

    外键关联:一个表中有主键也有外键,外键是另外一个表的主键的引用。

package HibernateRelation;

public class User2 {
	private int userid;
	private String name;
	private String password;
	private Address2 address2;

	public Address2 getAddress2() {
		return address2;
	}
	public void setAddress2(Address2 address2) {
		this.address2 = address2;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

}

  

package HibernateRelation;

public class Address2 {
	private int addressid;
	private String addressinfo;
	public int getAddressid() {
		return addressid;
	}
	public void setAddressid(int addressid) {
		this.addressid = addressid;
	}
	public String getAddressinfo() {
		return addressinfo;
	}
	public void setAddressinfo(String addressinfo) {
		this.addressinfo = addressinfo;
	}

}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 16:49:52 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.User2" table="USER2">
        <id name="userid" type="int">
            <column name="USERID" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <many-to-one name="address2" class="HibernateRelation.Address2" fetch="join" unique="true">
            <column name="ADDRESS2" />
        </many-to-one>
    </class>
</hibernate-mapping>

    这个配置文件,主要是写成many-to-one,unique设置为true。column的name为属性名,关联类配置在class中,在表中建立的外键名column中可以设置。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 16:49:52 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.Address2" table="ADDRESS2">
        <id name="addressid" type="int">
            <column name="ADDRESSID" />
            <generator class="identity" />
        </id>
        <property name="addressinfo" type="java.lang.String">
            <column name="ADDRESSINFO" />
        </property>
    </class>
</hibernate-mapping>

    一对多映射:一个用户可以有多个收货地址,在这个设计中,官方说法是在多的一方加入外键,并指向一的一方。就是在address表中加入一个用户id,user的id为地址的识别码,id=2的用户在address表中可以有多条地址记录,他们隶属于外键id=2这个用户之下。

    实现方法就是在bean类中加入一个集合set,然后生成xml的时候会自动配置。

package HibernateRelation;

import java.util.HashSet;
import java.util.Set;
//一个用户对应多个地址
public class User1 {
	private int userid;
	private String name;
	private String password;
	private Set<Address1> addresses=new HashSet<Address1>();
	public User1(){

	}
	public User1(int userid,String name,String password){
		this.userid=userid;
		this.name=name;
		this.password=password;
	}
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Set<Address1> getAddresses() {
		return addresses;
	}
	public void setAddresses(Set<Address1> addresses) {
		this.addresses = addresses;
	}

}

  

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 15:56:52 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.User1" table="USER1">
        <id name="userid" type="int">
            <column name="USERID" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <set name="addresses" table="ADDRESS1" inverse="false" lazy="true">
            <key>
                <column name="USERID" />
            </key>
            <one-to-many class="HibernateRelation.Address1" />
        </set>
    </class>
</hibernate-mapping>
package HibernateRelation;

public class Address1 {
	private int addressid;
	private String addressinfo;
	public int getAddressid() {
		return addressid;
	}
	public void setAddressid(int addressid) {
		this.addressid = addressid;
	}
	public String getAddressinfo() {
		return addressinfo;
	}
	public void setAddressinfo(String addressinfo) {
		this.addressinfo = addressinfo;
	}

}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 15:56:52 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.Address1" table="ADDRESS1">
        <id name="addressid" type="int">
            <column name="ADDRESSID" />
            <generator class="identity" />
        </id>
        <property name="addressinfo" type="java.lang.String">
            <column name="ADDRESSINFO" />
        </property>
    </class>
</hibernate-mapping>

    多对多映射:多个用户对应多个地址,这里是单向的多对多,也就是一个用户对应多个地址,一个地址对应多个用户,他们需要有一个中间表,来转换映射。

package HibernateRelation;

import java.util.HashSet;
import java.util.Set;

public class User3 {
	private int userid;
	private String name;
	private String password;
	private Set<Address3> address3s=new HashSet<Address3>();
	public int getUserid() {
		return userid;
	}
	public void setUserid(int userid) {
		this.userid = userid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Set<Address3> getAddress3s() {
		return address3s;
	}
	public void setAddress3s(Set<Address3> address3s) {
		this.address3s = address3s;
	}

}

  

package HibernateRelation;

public class Address3 {
	private int addressid;
	private String addressinfo;

	public int getAddressid() {
		return addressid;
	}
	public void setAddressid(int addressid) {
		this.addressid = addressid;
	}
	public String getAddressinfo() {
		return addressinfo;
	}
	public void setAddressinfo(String addressinfo) {
		this.addressinfo = addressinfo;
	}

}

    在这个配置中,需要修改set标签的table属性,改为一个新表,它会生成一个中间表。自动生成时候没有修改报了一个映射异常。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 18:35:47 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.User3" table="USER3">
        <id name="userid" type="int">
            <column name="USERID" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <set name="address3s" table="USER3_ADDRESS3" inverse="false" lazy="true">
            <key>
                <column name="USERID" />
            </key>
            <many-to-many class="HibernateRelation.Address3" column="ADDRESSID"/>
        </set>
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-8-16 18:35:47 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="HibernateRelation.Address3" table="ADDRESS3">
        <id name="addressid" type="int">
            <column name="ADDRESSID" />
            <generator class="identity" />
        </id>
        <property name="addressinfo" type="java.lang.String">
            <column name="ADDRESSINFO" />
        </property>
    </class>
</hibernate-mapping>
  • 后记

    余下细节以后补充。

时间: 2024-07-30 10:18:12

HIbernate的写法总结的相关文章

Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程

| 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SSH框架简介:①SSH框架是由struts2.spring.hibernate三大框架组合起来的一套总框架,一般来说这三个东西我们不会单独使用.  ②在学习SSH框架之前建议读者先学mvc,因为SSH是在mvc基础上根据mvc的缺点而产生的一套比较成熟的框架,也比较稳定.  ③SSH框架的流程:浏览器

Hibernate启动非常慢问题分析

项目中使用hibernate3,在启动项目过程中,发现加载显示数据很慢,要多几分钟才显示出数据,没有报其他异常.今天特别慢,过了好久都不加载显示数据. 排查思路有以下几个方面: 1.数据库是否开启.检查发现已经开启. 2.是否缺少包.检查git修改记录,没有发现改动. 3.tomcat.eclipse等是否配置正常.检查发现没有改动. 接下来就调试代码. 最开始是前端不抛任何错误,后来点击登录,发现抛出了前端ajax中自定义的错误(为了使错误更加明显,修改了错误提示信息) 先调试前端代码,发现直

hibernate 的第一个工程

一.什么是Hibernate? Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2

什么是O/RMapping?为什么要用O/R Mapping?

什么是O/R Mapping ? O/R Mapping 就是有一大堆的类库,我们调用它的时候用面向对象的方式来调,它帮我们翻译成为面向关系的方式. 为什么要用O/R Mapping? 我们编程会更加的面向对象,更加的简单,不用再去考虑SQL语句的问题了. 1,JDBC操作数据库很繁琐 2,Sql语句编写并不是面向对象的 3,可以在对象和关系之间建立关联来简化编程 4,O/R Mapping简化编程 5,O/R Mapping跨越数据库平台 比如hibernate,可以把方言改成从mysql改成

eclipse中SSH三大框架环境搭建&lt;三&gt;

相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的搭建以及简单使用,但是在访问数据库层面使用的是传统的JDBC.在我们项目开发中使用JDBC确实是不太理想的,所以今天我给大家来讲解一下目前行业中比较流行的持久层框架——hibernate. 第1步:我们依旧需要引入hibernate的jar包 找到hibernate解压好的文件目录,在该目录下的lib目录下有

SSH项目的搭建

SSH是指JavaEE中的三种框架:Struts2,Spring,Hibernate. 1,准备工作 1.先要有一个eclipse工具,运行环境是jdk1.8.tomcat8.0 2.然后在网上下载Struts2,Spring,Hibernate的包 这是我用的SSH的包和版本. 3.解压3个jar包: 这是Struts2解压后所需要的包的路径,D:\SSH的资源包\struts-2.3.30-apps\apps\struts2-blank\WEB-INF\lib ———————————————

Hibernate事务代码规范写法

----------------siwuxie095 事务相关概念 1.什么是事务 逻辑上的一组操作,构成这组操作的各个单元,要么一起成功, 要么一起失败 2.事务的四个特性 1)原子性 2)一致性 3)隔离性 4)持久性 3.不考虑隔离性,产生的问题 1)脏读 2)不可重复读 3)幻读(也称 虚读) 4.设置事务隔离级别,即可解决不考虑隔离性所产生的问题 「MySQL 默认的隔离级别:Repeatable Read(可重复读)」 5.Hibernate 也可以在核心配置文件中配置事务隔离级别

【Hibernate】Hibernate的层次划分,Hibernate4.3的初始化的新写法

在<[Hibernate]Hibernate的在Eclipse+Mysql的配置.安装,纯Java,利用Annotation与HQL完成数据库的增删改查>(点击打开链接)介绍了Hibernate的配置与基本结构,其作用就是数据库与Java文件的交互媒介.但是,上文的程序写得非常乱,也用很多Hibernate3的过时写法.主要是没有划分好层次所致.其实,虽然Hibernate的初始化越搞越复杂,首先要载入配置文件.建立一个Session的抽象工厂.最后则根据Session工厂建立Session,

Hibernate or JPA Annotation中BLOB、CLOB注解写法

BLOB和CLOB都是大字段类型,BLOB是按二进制字节码来存储的.而CLOB是能够直接存储字符串的. 在hibernate or JPA Annotation中.实体BLOB.CLOB类型的注解与普通的实体属性有些不同,详细操作例如以下: BLOB类型,类型声明为byte[]: private byte[] content; 注解: @Lob @Basic(fetch = FetchType.LAZY) @Column(name = "CONTENT", columnDefiniti