Hibernate属性注解
@Id
必须,定义了映射到数据库表中的主键的属性,一个实体类可以有一个或者多个属性被映射为主键,可置于主键属性或者getXxxx()前面;
注意:如果有多个属性定义为主键属性,该实体类必须实现serializable接口。
@GeneratedValue
@GeneratedValue(strategy = GenerationType.AUTO,generator = ""):可选,用于定义主键生成策略
strategy表示主键生成策略,取值有:
1.GenerationType.AUTO:根据底层数据库自动选择(默认)
2.GenerationType.IDENTITY:主键由数据库自动生成(主要是自动增长型)
3.GenerationType.SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
4.GenerationType.TABLE:使用一个特定的数据库表格来保存主键。总和@TableGenerator使用。
@Column:将属性映射到列,使用该注解覆盖默认值,@Column描述数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有用。常用属性:
name:可选,表示数据表中该字段的名称
nullable:可选,表示该字段是否允许为null,默认为true
unique:可选,表示该字段是否是唯一标识,默认为false
length:可选,表示该字段的大小,仅对String类型字段有效,默认值255,如果是主键不要使用默认值
insertable:可选,表示在ORM框架执行插入操作时,该字段是否应出现在insert语句中,默认为true
updateable:可选,表示ORM框架执行更新时,该字段是否应该出现在update语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用。
@Transient:可选,表示属性并非是一个到数据库表的字段的映射,ORM框架将忽略该属性。
@Embedded:注释属性的,表示该属性的类是嵌入类。同时嵌入类也必须标注@Embeddable注解。
@EmbeddedId:使用嵌入式主键类实现复合主键。嵌入式主键类必须实现Serializable接口、必须有默认的public无参数的构造方法、必须覆盖equals和hashCode方法。使用方法参考如下代码:(在使用过程中发现一个问题,springboot默认创建数据库的时候会使用engine=MyISAM,此时如果PersonPK中的id和sid使用默认长度,那么会创建失败,需要设置id和sid的长度。如果设置engine=InnoDB,则创建成功。)
复合主键类
package com.springboot.springbootlearning.dataobject;
//Person主键类
import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
@Embeddable
public class PersonPK implements Serializable{
private static final long serialVersionUID = -8667734571914799662L;
@Column(length = 18)
private String id; //身份证号
@Column(length = 11)
private String sid; //学号
public PersonPK(){}
public PersonPK(String id, String sid) {
this.id = id;
this.sid = sid;
}
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 int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
}
实体类
package com.springboot.springbootlearning.dataobject;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
@Entity
public class Person {
@EmbeddedId
private PersonPK personPK;
private String major;
private String gender;
public Person() {
}
public Person(PersonPK personPK, String major, String gender) {
this.personPK = personPK;
this.major = major;
this.gender = gender;
}
public PersonPK getPersonPK() {
return personPK;
}
public void setPersonPK(PersonPK personPK) {
this.personPK = personPK;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
package com.springboot.springbootlearning.repository;
import com.springboot.springbootlearning.dataobject.Person;
import com.springboot.springbootlearning.dataobject.PersonPK;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PersonRepository extends JpaRepository<Person,PersonPK>{
}