欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-13 21:16:05
...

属性映射

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位的十六进制字符串
guid SQL 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;

    ....
}