JPA+Hibernate 3.3 ——基本属性映射
1、数据库中字段的数据类型为longtext
存放二进制文本的注解方式
private byte[] file; //设置延迟初始化 @Lob @Basic(fetch=FetchType.LAZY) public byte[] getFile() { return file; } public void setFile(byte[] file) { this.file = file; }
数据库中数据类型为longblob
设置该属性与字段没有映射关系的注解方式
private String Mail; @Transient public String getMail() { return Mail; } public void setMail(String mail) { Mail = mail; }
2、二进制文件格式类型
private byte[] file; //设置延迟初始化 @Lob @Basic(fetch=FetchType.LAZY) public byte[] getFile() { return file; } public void setFile(byte[] file) { this.file = file; }
3、设置字段属性的注解方式
private String userName; @Column(length=20,nullable=false,name="name") public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; }
length表示字段的长度
nullable表示字段是否为空,false表示不能为空,true表示可以为空
name表示修改字段名称,默认情况下采用属性名称作为字段名称
通过@Column注解设置,包含的设置如下
name
name属性定义了被标注字段在数据库表中所对应字段的名称;
unique
unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
nullable
nullable属性表示该字段是否可以为null值,默认为true。
insertable
insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
updatable
updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
columnDefinition
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
table
table属性定义了包含当前字段的表名。
length
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
precision和scale
precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
@Column(name = "user_code", nullable = false, length=32)//设置属性userCode对应的字段为user_code,长度为32,非空 private String userCode; @Column(name = "user_wages", nullable = true, precision=12, scale=2)//设置属性wages对应的字段为user_wages,12位数字可保留两位小数,可以为空 private double wages; @Temporal(TemporalType.DATE)//设置为时间类型 private Date joinDate;
4、设置数据类型为date的注解方式
private String birthday; @Temporal(TemporalType.DATE) public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; }
TemporalType.DATE 其效果为1985-06-18
TemporalType.TIME 其效果为16:15:05
TemporalType.TIMESTAMP 其效果为1985-06-18 16:15:05
5、设置数据类型为枚举的方式
package com.hujuan.bean; public enum Gender { MEN,WOMEN } //设置默认值为MEN private Gender gender = Gender.MEN; @Enumerated(EnumType.STRING) @Column(length=5,nullable=false) public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; }
EnumType.STRING 存进数据库的为字符串即MEN或WOMEN
EnumType.ORDIAL 存进数据库的为索引即0或1
存放大文本的注解方式
private String info; @Lob public String getInfo() { return info; } public void setInfo(String info) { this.info = info; }
6、字段排序
在加载数据的时候可以为其指定顺序,使用@OrderBy注解实现
@Table(name = "USERS") public class User { @OrderBy(name = "group_name ASC, name DESC") private List books = new ArrayList(); }
7、主键生成策略
一般是如下4种:
1. AUTO:自动自增生成
AUTO是默认的主键生成策略,使用了AUTO策略,JPA会根据不同的数据库类型来实现自增策略。比如MySql的表主键是自增1的,那么此策略就会按照数据库的自增1策略,每次插入数据库记录的时候都会自增1。Java代码片段如下:
@Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id;
2. TABLE:自定义表生成器
自定义表生成器是在数据库中再建立一张新的表,这张表不是业务表,而是一张特殊表,这张表是专门用来管理整个数据库的主键的具体值的。在数据库中建立一张表如下图所示:
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "myTablePK") @TableGenerator( name = "myTablePK", table = "tb_pk", pkColumnName = "table_PK_name", pkColumnValue = "tb_contact_pk", valueColumnName = "table_PK_value", allocationSize = 1) private Integer id;
下面对@TableGenerator标记的属性说明一下:
Name:引用@GeneratedValue里面的generator的值
Table:数据库中专门用于生成主键的特殊表的表名
pkColumnName:tb_pk表中哪个字段代表了被服务(需要生成主键表)的表名
valueColumnName:指定此辅助表的哪个字段存储了主键的具体值
pkColumnValue:指明一个主键名称,依靠这个名称可以在这张特殊表中找到唯一的table_PK_value的值,而这个值就是具体的主键值。换句话说,数据库有几个业务表,这张表就应该有几条记录才对(除去复合主键的情况)
allocationSize:代表自增数
3. Identity:像MS SQL支持Identity字段的生成主键策略
4. Sequence:像Oracle支持Sequence的生成主键策略
public class Users implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY)//主键自增,注意,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的 @Column(name = "user_id", nullable = false) private int userId; public class Users implements Serializable { @Id @GeneratedValue(strategy=GenerationType.TABLE)//通过一个表来实现主键id的自增,这种方式不依赖于具体的数据库,可以解决数据迁移的问题 @Column(name = "user_code", nullable = false) private String userCode; public class Users implements Serializable { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE)//通过Sequence来实现表主键自增,这种方式依赖于数据库是否有SEQUENCE,如果没有就不能用 @SequenceGenerator(name="seq_user") @Column(name = "user_id", nullable = false) private int userId;