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;
....
}
上一篇: 秦始皇在位时期军队实力那么强 皇帝死后军队实力为什么下降那么快
下一篇: Redis提供的持久化机制