03.hibernate增删改查以及主键生成策略

之前我们对表进行修改,将表和java对象联系起来采用的是personPO.hbm.xml文件,由于过于麻烦我们采用注解的形式进行关联。
     
@Entity
@Table(name="t_person")
public class PersonPO {
	private String pid;
	private String name;
	private Date birthday;
	@Id
	//整形自动编号
	//@GeneratedValue()
	//使用序列
	//@GenericGenerator(strategy="sequence" ,name="seq_abcd")//oracle
	//@GeneratedValue(strategy=GenerationType.IDENTITY)
	//uuid
	@GenericGenerator(name="person_uuid",strategy="uuid")
	@GeneratedValue(generator="person_uuid")
	
	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
//	@column()//name length
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	


}


public class PersonDAOTest {
	public static void main(String args[])
	{
        	 //创建配置对象
        	 Configuration cfg=new Configuration().configure("config/hibernate/cfg.xml");
        	 //获取sessionFactory
        	 SessionFactory sessionFactory=cfg.buildSessionFactory();
        	 //创建会话
             Session session=sessionFactory.openSession();
             PersonPO person=new PersonPO();
           // person.setPid(1);
            person.setName("zhaomin");
            person.setBirthday(new Date());
             //添加事务
             session.beginTransaction();
              session.save(person); //增加  
             //session.update(person);//根据主键进行修改
            
           // session.delete(person);//删除
            session.getTransaction().commit();
           //  person=(PersonPO)session.get(PersonPO.class, 1);
          //   System.out.println(person.getName());  //查询
             session.close();
         }
}


<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/testdata</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>


        <!-- JDBC connection pool (use the built-in)   连接池 -->
        <property name="connection.pool_size">1</property>
        <!-- SQL dialect方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!-- Drop and re-create the database schema on start upcreate每次执行就再次创建   update只是进行修改 -->
        <property name="hbm2ddl.auto">update</property>  
        <mapping class="net.dfrz.po.PersonPO"/>    
    </session-factory>
</hibernate-configuration>

      主键生成策略:

 assign  主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。
increasement  Hibernate调用org.hibernate.id.IncrementGenerator类里面的generate()方法,使用select max(idColumnName) from tableName语句获取主键最大值。该方法被声明成了synchronized,所以在一个独立的Java虚拟机内部是没有问题的,然而,在多个JVM同时并发访问数据库select max时就可能取出相同的值,再insert就会发生Dumplicate entry的错误。所以只能有一个Hibernate应用进程访问数据库,否则就可能产生主键冲突,所以不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。
hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。
sequence 采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。
identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。
native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。
UUID:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:

xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)

其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。

GUID:Globally Unique Identifier全球唯一标识符,也称作 UUID,是一个128位长的数字,用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。

foreign使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

select使用触发器生成主键,主要用于早期的数据库主键生成机制,能用到的地方非常少。


注解的属性:类别注解

@Entity     映射实体类

@Table    映射数句库表
@Entity(name="tableName") - 必须,注解将一个类声明为一个实体bean。
属性:
name - 可选,对应数据库中的一个表。若表名与实体类名相同,则可以省略。
 @Table(name="",catalog="",schema="")  - 可选,通常和@Entity 配合使用,只能标注在实  体的 class 定义处,表示实体对应的数据库表的信息。
属性:
name - 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需            要指定表名
catalog - 可选,表示Catalog名称,默认为 Catalog("").
schema - 可选 , 表示 Schema 名称 , 默认为Schema("").

属性注解

@Id     映射生成主键

@Version    定义乐观锁

@Column     映射表的列

@Transient     定义暂态属性  


@Column - 可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库表中           该字段的详细定义,这对于根据 JPA 注解生成数据库表结构的工具非常有作用。

属性:

name - 可选,表示数据库表中该字段的名称,默认情形属性名称一致

nullable -可选,表示该字段是否允许为 null,默认为true

unique - 可选,表示该字段是否是唯一标识,默认为 false

length - 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.

insertable -可选,表示在ORM框架执行插入操作时,该字段是否应出现INSETRT              语句中,默认为true

updateable -可选,表示在ORM 框架执行更新操作时,该字段是否应该出现在               UPDATE语句中,默认为 true. 对于一经创建就不可以更改的字段,该          属性非常有用,如对于 birthday字段。

columnDefinition - 可选,表示该字段在数据库中的实际类型。通常ORM框架可以根    据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据      库中字段类型究竟是 DATE,TIME还是TIMESTAMP. 此外 ,String 的默认映射类型为VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOBTEXT字段类型,该属性非常有用。

示例 :

    @Column(name="BIRTH",nullable="false",columnDefinition="DATE")

    public String getBithday() {

       return birthday;

    }


@Id - 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主  键,置于 getXxxx() 前。

 

@GeneratedValue(strategy=GenerationType,generator="") - 可选,用于定义主键生成策略。

属性:

Strategy - 表示主键生成策略,取值有:

GenerationType.AUTO - 根据底层数据库自动选择(默认),若数据库支持自动              增                                       长类型,则为自动增长。

GenerationType.INDENTITY - 根据数据库的Identity字段生成,支持DB2、MySQL、                                        MS、SQL Server、SyBase与HyperanoicSQL数据库的Identity                                          类型主键。

GenerationType.SEQUENCE - 使用Sequence来决定主键的取值,适合Oracle、DB2等                                      支持Sequence的数据库,一般结合@SequenceGenerator使用。

(Oracle没有自动增长类型,只能用Sequence)

GenerationType.TABLE  - 使用指定表来决定主键取值,结合@TableGenerator使用。

如:

@Id

@TableGenerator(name="tab_cat_gen",allocationSize=1)

@GeneratedValue(Strategy=GenerationType.Table)

Generator - 表示主键生成器的名称,这个属性通常和ORM框架相关 , 例如:

Hibernate 可以指定 uuid 等主键生成方式

 

@SequenceGenerator — 注解声明了一个数据库序列。

属性:
name - 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中。
sequenceName - 表示生成策略用到的数据库序列名称。
initialValue - 表示主键初始值,默认为0.
allocationSize - 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.

示例 :

    @Id

    @GeneratedValues(strategy=StrategyType.SEQUENCE)

    public int getPk() {

       return pk;  

    } 

 

Hibernate的访问类型为field时,在字段上进行注解声;

访问类型为property时,在getter方法上进行注释声明。







   







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值