JPA注解

来源:互联网 发布:java 日期格式化 时区 编辑:程序博客网 时间:2024/05/17 22:00

参考http://www.blogjava.net/sxyx2008/archive/2010/07/20/326601.html

import javax.persistence.Id;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.MappedSuperclass;@MappedSuperclasspublic abstract class BaseEntity<PK extends Serializable> {    @Id    @GeneratedValue(strategy=GenerationType.IDENTITY)    private Long id;    @Column(name="begin_time")    private Date beginTime;//开始时间 }

@id
声明属性为主键

@GeneratedValue(strategy=GenerationType,generator=”“)
strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4种
generator:表示主键生成器的名称

@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方法,构造方法}

1、@Entity(name=”EntityName”)

必须,name为可选,对应数据库中一的个表

2、@Table(name=”t_danger”)

可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息

name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名
3、@Column
@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.

name:表示数据库表中该字段的名称,默认情形属性名称一致

nullable:表示该字段是否允许为null,默认为true

unique:表示该字段是否是唯一标识,默认为false

length:表示该字段的大小,仅对String类型的字段有效

/*表关系为一对多和多对一时,涉及到的注释@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

0 0
原创粉丝点击