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

posted on 2017-05-03 11:20  dreamstar  阅读(137)  评论(0编辑  收藏  举报