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
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA注解
- JPA 注解
- JPA注解
- JPA注解
- JPA 注解
- JPA 注解
- JPA 注解
- JPA注解
- Klocwork代码静态检查实践
- Webview控件的使用
- java基础 01 从零开始,每次都有新发现
- NYOJ 单词拼接(求有向图的欧拉通路)
- C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
- JPA注解
- [LeetCode
- 详解CorelDRAW双色图样填充
- 内容垂直居中
- Envy(最大值前后缀 +双指针 + 二分)
- sessionstorage,localstorage和cookie之间的区别
- 【小程序】POST请求服务器接收不到参数
- PhpStorm中如何使用database工具,详细操作方法
- 面向对象的编程初学