Hibernate入门(3):属性映射 & 主键映射

属性映射

1)@Column 修饰属性

使用 @Column 修饰POJO属性,可以同时指定一些映射信息,常用的信息如下(这些@Column属性都是可选的):
name指定该列的列名
length指定该列的最大长度,默认 255
nullable指定该是否可以为空,默认 true
unique指定该列是否具有唯一约束, 默认 false
presicison该列为decimal时,指定该列支持的最大有效数位
scale该列为decimal时,指定该列支持的最大小数位
table指定该列所属的表名,当需要使用多个表来保存一个实体时,需要指定该属性
@Entity                
@Table(name="users")   
public class Users {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;
    
    @Column(name="user_name",length="30")
    private String name;
    ....
}

2)@Transient 修饰非持久化属性

可以使用@Transient 修饰不参与持久化映射的属性,作为该PO的附加信息属性,被修饰的属性不会与数据表的字段有映射关系;
@Entity                
@Table(name="users")   
public class Users {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;
  
    ....
    @Transient
    private String description; 
}

3)@Enumerated 修饰枚举类型属性

在某些情况下,持久化类的属性是一个枚举类型,即该属性只能接受几个固定的值,这种情况下可以使用  @Enumerated 来修饰;
@Enumerated 有2种储存枚举到数据库的方式, EnumType.ORDINAL 序数储存,EnumType. STRING 字符串储存;

如以下定义一个枚举类:
@Entity                
@Table(name="users")   
public class Users {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;
  
    ....
    @Enumerated(EnumType.ORDINAL)  //使用序号储存枚举值
    @Column(name="sex")
    private Sex sex;
}
public enum Sex{
    MALE,FEMALE
}
@Entity                
@Table(name="users")   
public class Users {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;
  
    ....
    @Enumerated(EnumType.ORDINAL)  //使用序号储存枚举值
    @Column(name="sex")
    private Sex sex;
}

4)@Lob,@Basic 修饰大数据类型的属性

数据库在保存图片、大段文字时,通常是使用Blob,Clob类型来保存,对应的 JDBC 类型为 java.sql.Blob ,java.sql.Clob,此时可以使用@Lob来修饰这种大数据类型;
当持久化类的属性为 byte[]、Byte[]、java.io.Serializable 类型时,@Lob 修饰属性映射为底层的 Blob 列;
当持久化类的属性为 char[]、Character[]、Java.io.String 类型时,@Lob 修饰属性映射为底层的 Clob 列;
//User.java
@Entity                
@Table(name="users")   
public class Users {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;
    ....
    @Lob
    @Column(name="headshot")
    private byte[] headshot;
}
如以下示例保存一张图片的过程
public class UserManager {
    public static void main(String[] args){
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml")
                .build();
        try{
            SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
            Session session = sessionFactory.openSession();
            Transaction tran = session.beginTransaction();

            
            Users user = new Users();
            user.setName("Al-assad");
            
            //读取本地中的一个图像文件,保存到实体
            File file = new File("headshot.png");
            byte[] content = new byte[(int)file.length()];
            new FileInputStream(file).read(content);
            user.setHeadShot(content);
            
            session.save(user);
            tran.commit();
            
            session.close();
            sessionFactory.close();

        }catch(Exception ex){
            StandardServiceRegistryBuilder.destroy(registry);
        }
    }
}

5)@Temporal 修饰日期类型的属性

@Temporal 用于修饰日期类型的属性,将 Java中的 Java.util.Date,Java.util.Calendar类属性映射为数据库中的 date、time、timestamp类型数据列;
其所在的 value 属性包含3个值:Temporal.DATE(date日期类型), Temporal.TIME(time时间类型),Temporal.TIMESTAMP(时间戳类型) ;
@Entity                
@Table(name="users")   

public class Users {
   
    @Id                
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;

    ...

    @Column(name="create_date")
    @Temporal(TemporalType.DATE)
    private Date createDate;

    ...
}


主键映射

在现代数据库建模理论中,建议不使用具有实际意义的物理主键,而使用没有实际意义的逻辑主键。已减少数据库维护的复杂度,Hibernate提供了大量的逻辑主键构造器;
如果实体类的标识属性是基本类型、基本类型的包装类,String,Date等,可以简单使用 @Id 进行修饰;

如果希望 Hibernate 自动生成主键值,则还需要   @GeneratedValue  来修饰标识属性,该标识具有的属性如下(这些属性都是可选的):
strategy指定主键生成策略,包含以下4个属性:
GenerationType.AUTO:默认值,自动选择主键生成策略;
GenerationType.IDENTITY:对于 MySQL,SQL Server 等数据库,选择自动增长的主键生成策略;
GenerationType.SEQUENCE:对于 Oracle 等数据库,选择基于sequence 的主键生成策略,要和 @SequenceGenerator 一同使用;
GenerationType.TABLE:使用辅助表来生成主键,要与
@TableGenerator 一同使用;
generator当使用 GenerationType.SEQUENCE,GenerationType.TABLE 主键生成策略时,该属性需要应用@SequenceGenerator,@TableGenerator 生成器;
示例如下:
@Entity                
@Table(name="users")   

public class Users {
   
    @Id                
    @GeneratedValue(strategy= GenerationType.IDENTITY)  
    @Column(name="user_id")   
    private int id;

    ....
}
除了 AUTO,INDETITY,SEQUENCE,TABLE 这4种 JPA 标准的主键生成策略,Hibernate还包含其他的主键生成策略,这些主键生成策略使用  @GenericGenerator 标注;
该标注包含name ,strategy 2个必须属性,strategy属性常用的可选值如下:
increment为 short,int,long 类型生成唯一属性,只能用于没有其他进程往同一个表中插入数据时使用,不可用于集群
indentity在 indentity 主键支持的数据表中使用,返回一个short,int 或 long 类型的标识值
sequence在 sequence 主键支持的数据表中使用,返回一个short,int 或 long 类型的标识值
hilo使用一个低位/高位算法高效地生成short,int 或 long 类型的标识值,该标识值只在一个特定的数据库中是唯一的
seqhilo使用一个低位/高位算法高效地生成 short,int 或 long 类型的标识值,需要给定一个数据库sequence名,历史主键保存在Sequence中
uuid使用一个128位的UUID算法生成字符串类型的标识符,这个标识符在一个网络是唯一的,UUID被编码为一个32位的十六进制字符串
guidSQL Server,MySQL中使用数据库生成的的 GUID 字符串
native根据底层数据库的能力选择 identity,sequence,hilo中的
使用示例如下:
@Entity                
@Table(name="users")   

public class Users {
   
    @Id
    @GenericGenerator(name="fk_hilo",strategy="hilo")
    @GeneratedValue(generator="fk_hilo")  
    @Column(name="user_id")   
    private int id;

    ....
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值