JPA注解
注解
@Entity(name=”EntityName”)
必须,name为可选,对应数据库中一的个表
@Table(name=”t_danger”)
可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息
name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
@id
声明属性为主键
@GeneratedValue(strategy=GenerationType,generator="")
strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4种
generator:表示主键生成器的名称
@Column
@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable:表示该字段是否允许为null,默认为true
unique:表示该字段是否是唯一标识,默认为false
length:表示该字段的大小,仅对String类型的字段有效
@MappedSuperclass
用在父类上面。当这个类肯定是父类时,加此标注。如果改成@Entity,则继承后,多个类继承,只会生成一个表,而不是多个继承,生成多个表
@Temporal主要是用来指明Java.util.Date 或 java.util.Calendar 类型的属性具体与数据库(date,time,timestamp)三个类型中的那一个进行映射
例如@Temporal(TemporalType.TIMESTAMP)
级联注解
总共有三张表:采集路线CollectLine ,采集点,目的地
其中采集路线和采集点的关系是一对多,采集线路和目的地的关系是一对一,目的地表是主表,是关系维护端
采集路线表
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.ManyToOne;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import com.alibaba.fastjson.annotation.JSONField;
@Entity
@Table(name="t_collect_line")
public class CollectLine extends BaseEntity<Long>{
@Column(name = "name", length = 100)
private String name;// 采集线路名称
//删除采集线路表时,级联删除属于这个表的采集点
@JSONField(serialize = false)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY)
private List<CollectLinePoint> collectLinePoints = new ArrayList<CollectLinePoint>();//关联采集点
//删除采集线路表时,级联删除属于这个表的目的地
@JSONField(serialize = false)
@OneToOne(cascade = CascadeType.ALL, mappedBy = "collectLine", fetch = FetchType.LAZY)
private Destination destination; //关联目的地
//getter setter方法,构造方法
}
目的地表
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
@Entity
@Table(name = "t_destination_point")
public class Destination extends BaseEntity<Long> {
@Column(name = "name", length = 50)
private String name;// 名称
@OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE }, fetch = FetchType.LAZY)
@JoinColumn(name = "collect_line_id")
private CollectLine collectLine; // 所属线路,目的地表是关系维护端
//getter setter方法,构造方法
}
采集点表
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.CascadeType;
import javax.persistence.FetchType;
@Entity
@Table(name = "t_collect_line_point")
public class CollectLinePoint extends BaseEntity<Long> {
@Column(name = "name", length = 50)
private String name;// 名称
@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.EAGER)
@JoinColumn(name = "collect_line_id")
private CollectLine collectLine;// 所属线路,采集点表是关系维护端
//getter setter方法,构造方法
}
/*表关系为一对多和多对一时,涉及到的注释
@JoinColumn,@JSONField,@OneToMany,@ManyToOne
主表用到的注解:@JSONField,@OneToMany
从表用到的注解:@JoinColumn,@ManyToOne*/
@JoinColumn用在主表(多对一时,多的那一端)
@JSONField注解 一般我习惯用在从表
@JSONField是fastjson中的一个注解。在属性头上加上这个注解中,在对对象进行json转换时,该属性,将不会参与格式化。
如果在从表中和主表中想关联的的属性时都没加这个注解,会抛出如下错误
如果类的某个字段加了这个属性
// 只序列化id和名称,就不会再序列化这个属性
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Area.class, "id", "name");
@OneToMany,@ManyToOne等有5个属性
1.casCade 该属性定义类和类之间的级联关系
可选值为CascadeType.PERSIST(级联新建)CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新) CascadeType.ALL 。
2.fetch属性,有两个值
FetchType.EAGER表示关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表示关系类在被访问时才加载。
默认值是FetchType.LAZY
3.optional = true 该属性可以为null
4.mappedBy 在从表中才定义这个属性
该属性的值为 在主表中定义的 从表类的字段名 。比如在主表(目的地)中定义的 从表(采集线路表)类的字段名
5.targetEntity属性:Class类型的属性。定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
casCade负责增删改,fetch负责查
主表是负责维护关系的那张表,也就是含有外键的那张表。根据主表中的外键,去从表中找对应的一条记录
比如,一对多时,多的那张是主表,一的那张是从表。
所以用注释的时候,
主表,用@joinColumn这个注释定义外键字段名字
从表用@JsonField这个注释,序列化主表时,不去序列化它相关的从表记录。再用@OnetoMany时,用mappedby
多对多@JoinTable
@Entity
@Table(name="t_resource")
public class Resource{
@JSONField(serialize = false)
@ManyToMany(mappedBy="resources",targetEntity=Role.class)
private Set<Role> roles=new HashSet<Role>();
}
@Entity
@Table(name="t_role")
public class Role extends {
@JSONField(serialize = false)
@ManyToMany(targetEntity=Resource.class, fetch = FetchType.LAZY)
@JoinTable(name="t_role_resource",joinColumns=@JoinColumn(name="role_id"),
inverseJoinColumns=@JoinColumn(name="resource_id"))
private Set<Resource> resources=new HashSet<Resource>();
}
会生成一张表,表名为:t_role_resourc,列名:role_id,列名resource_id