Hibernate简单crud和Hibernate主键生成策略

实体类编写规范

实体类里面属性是私有的

私有属性使用公开的set和get方法操作

要求实体类有属性作为唯一值(一般使用id值)

  • 实体类属性建议不使用基本数据类型,应该使用基本数据类型对应的包装类。
  • 八个基本数据类型对应的包装类

  • int —>Integer

  • char —>Character
  • 其他的都是首字母大写,比如double —>Double

为什么建议使用基本数据类型的包装类???

比如 表示学生的分数,假如 int score;

- 学生得了零分,可以用 int score=0;
- 如果表示没有参加考试,int score=0;不能准确表示学生是否参加考试。
- 解决:使用包装类就可以了,Integer score=0; 表示学生得了0分。
- 表示学生没有参加考试:Integer score=null;

Hibernate主键生成策略

Hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以有不同的生成策略。

Hibernate主键生成策略有很多值

increment:

用于long,short,或int类型,由Hibernate自动以递增的方式生成唯一标识符,每次增量为1。只有当没有其它进程向同一张表中插入数据时才能使用,不能在

集群环境下使用。适用于代理主键。

identity:

采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型。在DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL数据库中可以使

用该生成器,该生成器要求在数据库中把主键定义成为自增长类型,适用于代理主键。Orical不支持。

sequence:

Hibernate根据底层数据库序列生成标识符,条件是数据库支持序列。适用于代理主键。MySQL不支持这个属性。Orical支持。

native:

根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo三种生成器的一种,适合跨数据库平台开发。适用于代理主键。

uuid:

Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,其UUID被编码为一个长度为32位的十六进制字符串。这种

策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。适用于代理主键。

assigned:

由java程序员负责生成标识符,如果不指定id元素的generator属性,则默认使用该主键生成策略。适用于自然主键。

在generator属性里面有很多值,我们一般使用下面两种

  • native:根据使用的数据库帮你选择哪个值。
  • UUID:之前web阶段写代码生成uuid值,Hibernate帮我们生成uuid值。

要想使用uuid

<?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="cn.domarvel.entity.User" table="user">
        <id name="id" column="id">
            <generator class="uuid"></generator>
        </id>

        <property name="password" column="password" length="150"/>
        <property name="addr" column="addr" length="150"/>
    </class>
</hibernate-mapping>

实体类的操作

对实体类的crud操作

添加操作:

User user=new User('FireLang','成都');

//调用session的方法实现添加
session.save(user);

根据id进行查询:

  • 调用session里面的get方法实现。

下面用到了一个工具类,是在这篇博客里面讲解的

//注意这里的Book类必须写无参构造方法,因为这里会通过反射创建对象。session.get(Book.class, id);
public class ShowBook {

    public static void main(String[] args) {
        System.out.println(findBookById(1));
    }

    public static Book findBookById(Integer id){
        Book book=null;
        SessionFactory sessionFactory=HibernateUtils.getSessionFactory();
        Session session=sessionFactory.openSession();

        Transaction transaction=session.beginTransaction();

        book=session.get(Book.class, id);

        transaction.commit();

        session.close();
        sessionFactory.close();

        return book;
    }
}

修改操作

    @Test
    public void showBook(){
        SessionFactory sessionFactory=HibernateUtils.getSessionFactory();
        Session session=sessionFactory.openSession();
        Transaction transaction=session.beginTransaction();

        Book book=session.get(Book.class, 1);
        System.out.println(book);
        book.setPrice(333);
        session.update(book);
        book=session.get(Book.class, 1);
        System.out.println(book);

        transaction.commit();
        session.close();
        sessionFactory.close();
    }
/*
注意:当这里是先作查询操作,修改对象值,之后再通过session.save(Object);来保存。起到的效果和session.update(Object);效果一样。但是,如果我们是想修改某一样数据时,先创建实体对象,对象id保存着目标值,再通过save方法是无法和上面一样作更新操作的。这样的操作是保存一个新的值。同时你设置的id也会变得没有效果,既然相当于作新添加,那么id肯定就是表里面最大id加一了。
这里涉及到一个事务的特性,修改查询出来后的数据后(持久态),会自动帮我们修改值。也就是说,当我们查询出来值,修改值后,不管是否执行save还是update,这里都会做更新操作,如果你还是看不懂,看了后面的博客就知道了!!
*/

这是讲解上面说到的特性博客

下面是sql语句的执行过程:

Hibernate: 
    select
        book0_.id as id1_0_0_,
        book0_.bookname as bookname2_0_0_,
        book0_.price as price3_0_0_ 
    from
        book book0_ 
    where
        book0_.id=?
Book [bookname=精进:如何成为一个厉害的人, price=666, id=1]
Book [bookname=精进:如何成为一个厉害的人, price=333, id=1]
Hibernate: 
    update
        book 
    set
        bookname=?,
        price=? 
    where
        id=?

删除操作:

//删除操作的原理是根据id进行删除的。

//所以有两种方式:第一是通过id查询出实体对象后删除。第二种方式是创建一个实体对象给id赋值后再进行删除操作。

//1.
Book book = session.get(Book.class, 1);
session.delete(book);

//2.
Book book=new Book();
book.setUid(1);

session.delete(book);

savaOrUpdate方法

//添加操作
Book book=new Book('ACM入门训练指南',998);

//实体类对象的状态是瞬时态,做添加。
session.saveOrUpdate(book);
//修改操作
Book book = new Book(1,'数据结构',3);

//实体类对象的状态是托管态,做修改操作
session.saveOrUpdate(book);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值