hibernate 关于主键

本文为北京尚学堂hibernate视频的学习笔记

1在xml中定义单个主键生成策略

 1.1通过xml

<id name="id" type="long" >
     <generator class="identity"/>
</id> 
其中class有多种类型 但实际上我们只需记得四种

native  自动选择数据库
identity 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。

sequence 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
uuid: 使用一个128bit的字符串来标识主键

通过简单的比较 相信大家都明白如果是数字型的主键就选择native 它会设置为对应数据库的自增形式


1.2通过annotation

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() { ... }
其中strategy可以有以下四种形式

  • AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.
  • TABLE - 使用表保存id值
  • IDENTITY - identity column
  • SEQUENCE - sequence
tabel那个说实话 我自己也没有看懂

通过上面四句话 相信大家都知道 该使用那种了吧


2定义联合主键

2.1使用xml

package com.bjsxt.hibernate;

public class Student {
	
	private StudentPK pk;
	
	private int age;
	private String sex;
	//省略get/set方法	
}
package com.bjsxt.hibernate;

public class StudentPK implements java.io.Serializable{
	private int id;
	private String name;
	
	@Override
	public boolean equals(Object o) {
		if(o instanceof StudentPK) {
			StudentPK pk = (StudentPK)o;
			if(this.id == pk.getId() && this.name.equals(pk.getName())) {
				return true;
			}
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
}
每一个学生是以StudentPk作为主键 同时得记住主健类得复写equals和hashcode方法 同时实现serializable接口

    <class name="com.bjsxt.hibernate.Student">
        
        <composite-id name="pk" class="com.bjsxt.hibernate.StudentPK">
            <key-property name="id"></key-property>
            <key-property name="name"></key-property>
        </composite-id>
        
        <property name="age" />
        <property name="sex" />
        <property name="good" type="yes_no"></property>
    </class>
我想我依然不用说太多了

2.2使用annotation

2.2.1方法一将组件类注解为@Embeddable,并将组件的属性注解为@Id

如上例中 在studentpk类上@embeddable

在student中的getpkStudent方法上@id

2.2.1方法二将组件的属性注解为@EmbeddedId

在上例中只用在student中的getPKStudent()方法上加上@embeddedid

2.2.1方法三将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

如上例中在student类上加上

@IdClass(StudentPK.class)

在student类中getid和getname两个方法上都加上@id


主要使用的也是第二种方法


你可能感兴趣的:(java,Hibernate,xml,mysql)