回顾
属性级别注解
@Id
必须, 表示映射到数据库表中的主键的属性, 一个实体类可以有一个或多个属性被映射为主键, 可置于主键属性或者getXxx()方法上
如果一个类中有多个属性被定义为主键, 则该实体类必须实现Serializable接口
@GeneratedValue(strategy = "")
① strategy = GeneratedValue.AUTO //根据底层数据库自动选择(默认)
@Id //设置为主键
@GeneratedValue //主键自增
private int sid; //学号
② strategy = GeneratedValue.IDENTITY //根据数据库的identify字段自动生成(主键需要为整型)
③ strategy = GeneratedValue.SEQUENCE //使用sequence来决定主键的取值
④ strategy = GeneratedValue.TABLE //使用指定表来决定主键的取值(需要结合@TableGenerator(name = "指定表名"))
如果主键为字符串类型
@Id //设置为主键
@GeneratedValue(generator = "sid") //由于是主键的字符串类型, 无法使用默认自增, 此时需要指定主键生成器
@GenericGenerator(name = "sid", strategy = "assigned") //使用hibernate的注解自定义主键生成器, assigned为手动赋值
@Column(length = 8) //默认的长度为255, 对于主键来说太长, 需要重新指定
private String sid; //学号
@Column(可将属性映射到列)
name: 可选, 表示数据库表中该字段的名称, 默认情形和属性名称一致
nullable: 可选, 表示该字段是否允许为空, 默认为true
unique: 可选, 表示该字段的大小, 仅对String类型的字段有效, 默认值255(如果是主键不能使用默认值)
insertable: 可选, 表示在ORM框架执行插入操作时, 该字段是否应该出现在insert语句中, 默认为true
updatable: 可选, 表示在ORM框架执行更新操作时, 该字段是否应该出现在update语句中, 默认是为true, 对于一经创建就不可以更改的字段, 该属性非常有用, 如birthday(生日)字段
@Embedded(加在属性上, 表示这是一个嵌入类): 需要配合@Embeddable
@EmbeddedId(加在属性上, 表示这是一个复合主键类): 需要配合@Embeddable
@Id //设置为主键
@EmbeddedId //标注在属性上
private StudentPK pk; //学号
复合主键类StudentsPK
@Embeddable
public class StudentsPK implements Serializable {
private static final long serialVersionUID = 6632444697825110476L;
@Column(length = 18)
private String id; //身份证号
@Column(length = 8)
private String sid; //学号
public StudentsPK(String id, String sid) {
this.id = id;
this.sid = sid;
}
public StudentsPK() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
StudentsPK studentPK = (StudentsPK) o;
return id.equals(studentPK.id) &&
sid.equals(studentPK.sid);
}
@Override
public int hashCode() {
return Objects.hash(id, sid);
}
}
@Transient
可选, 表示该属性并非一个到数据库表的字段的映射, ORM框架将忽略该属性, 如果一个属性并非数据表中的字段映射, 就务必将其标示为@Transient, 否则ORM框架默认其注释为@Basic