JPA的常用Annotation
http://www.blogjava.net/zJun/archive/2007/01/24/95747.html
@transient 忽略该方法
一、
@Entity:通过@Entity注解将一个类声明为一个实体bean
@Table(name=”t_Husband”):通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)
二、
@Id:用于标记属性的主键
@GeneratedValue(默认取值anto,ID生成策略)
三、
@Column(name=”wifeid”):表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略
四、联合主键
当entity class使用复合主键时,需要定义一个类作为id class。id class必须符合以下要求:类必须声明为public,并提供一个声明为public的空构造函数。必须实现Serializable接,覆写 equals()和hashCode()方法。entity class的所有id field在id class都要定义,且类型一样。
在类名上@Entity@IdClass(TeacherPK.class)
在联合主键的两个属性上分别@Id@Id
public class EmployeePK implements java.io.Serializable{
      
String empName;
      
Integer empAge;
       public
EmployeePK(){}
       public
boolean equals(Object obj){ ......}
      
public int hashCode(){......}
   
}
@IdClass(EmployeePK.class)
   
@Entity
   
public class Employee {
       
@Id String empName;
       
@Id Integer empAge;
   
}
五、关联关系(在getter方法上加入以下Annotation)
1、1 to 1
(1)单向外键:
Husband中:
private Wife wife;
@OneToOne
@JoinColumn(name="wifeid")-->设置Husband表中的对应字段名,可以省略,默认字段名为类名_主键名
(2)双向外键:
Husband中:
private Wife wife;
@OneToOne
@JoinColumn(name="wifeid")-->设置Husband表中的对应字段名,可以省略,默认字段名为类名_主键名
Wife中:
private Husband husband;
@OneToOne(mappedBy="wife")-->wife为Husband类中的属性
(3)联合主键:(wife类中的id和name作为联合主键)
Husband中:
private Wife wife;
@OneToOne
@JoinColumns({ -->设置Husband表中的对应字段名,可以省略,默认字段名为类名_主键名
@JoinColumn(name="wifeid", referencedColumnName="id"),
@JoinColumn(name="wifename", referencedColumnName="name")
})
(4)组件映射:(Wife作为Husband的一部分,两个类一张表)
Husband中:
private Wife wife;
@Embedded
@Column-->可略
Wife中:
不需要@Entity@Id
2、1 to N , N to 1
设计:在“多”方加入外键,而不是在“一”方加入外键。下面三种方式生成的表是一样的。
(1)多对一单向
User中:
private Group group;
@ManyToOne
@JoinColumn-->可略
(2)一对多单向(在多方的表中加入外键)
Group中:
private User<Set> users = new HashSet<User>();
@OneToMany
@JoinColumn(name="groupid")-->避免产生中间表
(3)双向(应用少)
User中:
private Group group;
@ManyToOne
@JoinColumn-->可略
Group中:
private User<Set> users = new HashSet<User>();
@OneToMany(mappedBy="group")-->User类中的group属性
3、N to N
设计:加入中间表。下面两种方式生成的表一样。
(1)单向
Teacher中:
private Set<Student> students = new HashSet<Student>();
@ManyToMany
@JoinTable( -->修改中间表名及字段名
name=”teacher_student”,
joinColumns=@JoinColumn(name="t_ID", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="s_ID", referencedColumnName="id")
)
(2)双向(应用少)
Teacher中同上;
Student中:
private Set<Teacher> teachers = new HashSet<Teacher>();
@ManyToMany(mappedBy="students")
4、在@OneToOne@OneToMany@ManyToOne@ManyToMany后面的括号中可以加入两个属性:
cascade=CascadeType.ALL-->增删改数据时
fetch=FetchType.LAZY/EARGER-->读数据时
六、
@JoinColumn
如果在entity class的field上定义了关系(one2one或one2many等),我们通过JoinColumn来定义关系的属性。
name:列名。
referencedColumnName:该列指向列的列名(建表时该列作为外键列指向关系另一端的指定列)
unique: 是否唯一
nullable: 是否允许为空
insertable: 是否允许插入
updatable: 是否允许更新
columnDefinition: 定义建表时创建此列的DDL
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
下面的代码说明Husband和Wife是一对一关系。在Husband对应的映射表建一个名为wifeid的列,该列作为外键指向Wife对应表中的主键id。
public class Husband{
private
Wife wife;
@OneToOne
@JoinColumn(name="wifeid")
public
Wife getWife () {
return
wife;
}
7、
@JoinColumns
如果在entity class的field上定义了关系(one2one或one2many等),并且关系存在多个JoinColumn,用JoinColumns定义多个JoinColumn的属性。
元数据属性说明:
value: 定义JoinColumn数组,指定每个JoinColumn的属性。
下面的代码说明Husband和Wife是一对一关系。在Husband对应的映射表建两列,一个名为wifeid的列,该列作为外键指向Wife对应表中的主键id;另一个为wifename的列,该列作为外键指向Wife对应表中的主键name。
public class Husband{
private
Wife wife;
@OneToOne
@JoinColumns({
@JoinColumn(name="wifeid",
referencedColumnName="id"),
@JoinColumn(name="wifename",
referencedColumnName="name")
})
public
Wife getWife () {
return
wife;
}
8、
@JoinTable
JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTable,使用JoinTable的默认值。
元数据属性说明:
- name:这个join table的名字。
 - joinColumns:定义指向所有者主表的外键列,数据类型是JoinColumn数组。
 - inverseJoinColumns:定义指向非所有者主表的外键列,数据类型是JoinColumn数组。
 
下面的teacher类代码定义了一个连接表teacher和student的join table。join table的表名是teacher_student,包含两个外键,一个外键是t_ID,指向表teacher的主键ID,另一个外键是s_ID,指向表student的主键ID。其中referencedColumnName可以省略。
public class Teacher{
private Set<Student> students = new HashSer<Student>();
@ManyToMany
@JoinTable(
name=”teacher_student”,
joinColumns=@JoinColumn(name="t_ID",
referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="s_ID",
referencedColumnName="id")
)
public Set<Student> getStudents(){
return students;
}
JPA的常用Annotation的更多相关文章
- jpa基于按annotation的hibernate主键生成策略
		
JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hib ...
 - 3、JPA一些常用的注解
		
常用注解有下面这些: ①:@Entity.@Table.@Id.@GeneratedValue.@Column.@Basic ②:@Transient 用于忽略某个属性,而不对该属性进行持久化操作 ③ ...
 - JPA之常用 基本注解
		
1.常用基本注解 @Entity @Table @Basic @Column @GeneratedValue @Id 2.特殊注解 @Transient @Temporal 用 table 来生成主键 ...
 - Spring Data JPA 中常用注解
		
一.java对象与数据库字段转化 1.@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 2.@Table:设置实体类在数据库所对应的表名 3.@Id:标识类里所在变量为主 ...
 - 17 Spring Data JPA的常用接口分析
		
思考 在客户的案例中,我们发现在自定义的CustomerDao中,并没有提供任何方法就可以使用其中的很多方法,那么这些方法究竟是怎么来的呢?答案很简单,对于我们自定义的Dao接口,由于继承了JpaRe ...
 - Spring常用annotation标签
		
@Service @Scope @Transactional @Autowired @Qualifier @PostConstruct @PreDestroy
 - Hibernate常用Annotation标签说明
		
@ javax.persistence.Entity 实体类定义,该标签表示当前类是一个Hibernate的数据库实体,对应着数据库中的某个表 位置:用于类级别 参数:无 样例:@Entity 注意: ...
 - JPA常用注解
		
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA由EJB 3.0软件专家 ...
 - JPA常用注解(转载)
		
转自:http://blog.csdn.net/wanghuan203/article/details/8698102 JPA全称Java Persistence API.JPA通过JDK 5.0注解 ...
 
随机推荐
- pandas将非数值型特征转化为数值型(one-hot编码)
			
import pandas as pd import numpy as np import matplotlib.pyplot as plt name = np.array([['jack', 'ro ...
 - C语言 俄罗斯方块的实现1 全局变量
			
目录 全局变量 程序的模块化之MVC 关于俄罗斯方块的代码实现要点 使用数组表示背景和方块 方块表示及其初始化 要让游戏动起来 方块自动下落 全局变量 简而言之,定义在函数外的变量,就是全局变量. 所 ...
 - jmeter—获取当前时间(年、月、日),往前/往后n天
			
import java.util.Calendar; Calendar cal = Calendar.getInstance(); int day = cal.get(Calendar.DATE); ...
 - python 爬虫 urllib模块 url编码处理
			
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...
 - poj1050-最大子矩阵(dp)
			
链接:http://poj.org/problem?id=1050 题意:给定n*n的矩阵,求和最大的子矩阵. 思路:我们将二维矩阵降维至一维,即将第i行到第j行的所有列压缩成一行,我们可以在线性时间 ...
 - [转帖]微软 SQL Server 2008/R2 停止支持
			
微软 SQL Server 2008/R2 停止支持 微软停止支持 SQLSERVER 2008R2 https://t.cj.sina.com.cn/articles/view/3172142827 ...
 - oracle在group by时某列有多个值的拼接
			
最近编码过程中出现了group by后,某些列会有多个值,而我需要把这些多个值的列进行拼接的情况,和大家分享一下. 有如下表student: 我们希望以class分组,每组的信息平铺,效果如下 分组首 ...
 - sts使用mybatis插件直接生成数据库表的mapper类及配置文件
			
首先点击help------>Eclipse Marketplace----->在find中搜索mybatis下面图片的第一个 点击installed 还需要一个配置文件generator ...
 - Luogu P4118 [Ynoi2016]炸脖龙I
			
题目 首先考虑没有修改的情况.显然直接暴力扩展欧拉定理就行了,单次复杂度为\(O(\log p)\)的. 现在有了修改,我们可以树状数组维护差分数组,然后\(O(\log n)\)地单次查询单点值. ...
 - Django重写用户模型报错has no attribute 'USERNAME_FIELD'
			
目录 Django重写用户模型报错has no attribute 'USERNAME_FIELD' 在重写用户模型时报错:AttributeError: type object 'UserProfi ...