Annotation中ID生成策略:
1. 手动指定;没说的之前写过,xml和属性都使用过;@Id
2. 使用 Generator 生成器;
Generator 有很多值:常用的有native , identity, sequence,uuid(id类型 String) ;
使用Generarot帮我们自动生成ID:
@GeneratedValue
注视在 @Id下:
@Id
@GeneratedValue
默认策略 auto/native ;如果你使用MySQL,那么自动使用 auto_increment
指定ID生成策略 @GeneratedValue
@GeneratedValue(strategy=GenerationType.AUTO) @GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(strategy=GenerationType.SEQUENCE) @GeneratedValue(strategy=GenerationType.TABLE)
这里要注意要使用数据库支持的,比如这里MySQL我们使用IDENTITY ;
GenerationType.TABLE 主要用于跨数据库平台,很少用,标记下;
在使用Annotation使用联合主键有三种方式:
1. 将你的多个Primary Key放置一个新类中(主键类),并且用注解@Embeddable 声明主键类即可;实体类使用注解@Id指向主键类
2. 将你的多个Primary Key放置一个新类中(主键类),实体类使用注解@EmbeddedId指向主键类即可;
3. 实体类中在所有需要设置为主键的属性上都加入@Id注解,然后在注解实体类下面添加一个如下注解:
@IdClass(value=XXX.class) 这里的XXX对应你的主键类名
3种之中最适合的书写习惯的是第3种,但是第二种比较方便,也很常用;
但是不管哪一种使用方法,对于使用联合主键而言,你的主键类都需要使用Serializable接口,并且重写equals和hashCode函数;
Serializable接口 原因是:序列化就是为了能暂存一些对象到硬盘中;
重写equals函数 , 原因是:内存中的对象区分;
重写hashCode 函数, 原因是:根据哈希码快速索引
主键类
- package com.tyzy.bean.resource;
- import java.io.Serializable;
- import javax.persistence.Embeddable;
- @Embeddable
- public class Primaryid implements Serializable{
- private static final long serialVersionUID = -3449712581842566658L;
- private Long rid;
- private Long sid;
- public Long getRid() {
- return rid;
- }
- public void setRid(Long rid) {
- this.rid = rid;
- }
- public Long getSid() {
- return sid;
- }
- public void setSid(Long sid) {
- this.sid = sid;
- }
- }
与数据库相关联的表类
- package com.tyzy.bean.resource;
- import java.io.Serializable;
- import javax.persistence.EmbeddedId;
- import javax.persistence.Entity;
- import javax.persistence.Table;
- @Entity
- @Table(name="TResourceIndustry") //类名与表名相同则不需要指定
- public class ResourceIndustry implements Serializable{
- private static final long serialVersionUID = -4410748581764041711L;
- @EmbeddedId //指定主键为主键类
- private Primaryid primaryid ;
- public Primaryid getPrimaryid () {
- return primaryid ;
- }
- public void setPrimaryid (Primaryid primaryid ) {
- this.primaryid = primaryid ;
- }
- }
需要条件查询时用到主键中的属性时的Hql语句:
String hql="select * from TResourceIndustry where primaryid.sid=? and primaryid.rid=? ";