JPA的注解既可以写在属性上,也可以写在get方法上,两者有何区别?
复杂Entity类是指在Entity类的getter/setter中包含比较复杂的业务逻辑而不是仅仅返回某个属性。在绝大部分的商业应用,开发人员都可以忽略这部分无需关心。EJB3持久化规范中,针对可持久化属性定义了两种属性访问方式(access): FIELD和PROPERTY。
如果采用access=FIELD, EJB3 Persistence运行环境直接访问对象的属性变量,而不是通过getter。这种访问方式也不要求每个属性必须有getter/setter。如果需要在getter中包含商业逻辑,应该采用access=FIELD的方式。
如果采用access=PROPERTY, EJB3 Persistence运行环境将通过Entity类上的getter来访问对象的属性变量,这就要求每个属性变量要有getter/setter方法。在EJB3中,默认的属性访问方式是PROPERTY。此时getter/setter方法的逻辑应该尽量简单。
一个简单的例子如下:
@Entity
public class User {
private int id;
// @Column(length=10) // 注解在此处则表中字段为name
private String name;
public User() {}
@Id @GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(length=10) // 注解在此处则表中字段为name1
public String getName1() {
return name;
}
public void setName1(String name) {
this.name = name;
}
}
每个公民都对应一个身份证号,两者的关系是一对一关系,构建实体Person和PID:
@Entity
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(length=10,nullable=false)
private String name;
@OneToOne(optional=false,cascade=CascadeType.ALL)
@JoinColumn(name="pid_id")
private PID id;
public Person() {
this.name = "lzz";
}
public Person(String name) {
this.name = name;
}
// getter and setter
}
@Entity
public class PID {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String pid;
@OneToOne(mappedBy="pid",cascade={CascadeType.PERSIST
,CascadeType.MERGE,CascadeType.REFRESH}
,optional=false)//指定为关系的被维护端,这里的optional可以去掉,因为外键不允许为空
private Person person;
public PID(String pid) {
this.pid = pid;
}
public PID() {
this.pid = "xxx";
}
// getter and setter
}
每次购物总会购买多样商品,订单和商品是一对多的关系,构建实体Order和Item
@Entity
public class Order_ {
/**
* 双向的一对多关系里面,多的一方为关系的维护端。 关系的维护端负责外键字段(记录)的更新; 关系的被维护端是没有权力更新外键字段(记录)的。
*/
@Id @GeneratedValue
private int id;
@Column(nullable = false)
private float amount;
/**
* 延迟加载必须保证em是开着的 如果是ToMany则默认延迟加载 如果是ToOne则默认是立即加载
* 通过mappedBy声明关系的维护端,这里是指明在OrderItem类里面的哪个属性来维护关系
* 在哪个类出现mappedBy则表明该实体是关系被维护端。
*/
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order")
private List<Item> items = new ArrayList<Item>();
// 建立关系维护
public void addOrderItem(Item item) {
item.setOrder(this);// 关系维护端orderItem来设置,维护关系
this.items.add(item);
amount += item.getPrice();
}
// getter and setter
}
注:在试验过程中,如果该实体取名Order时总是无法生成表,不知何故?
@Entity
public class Item {
/**
* 双向的一对多关系里面,多的一方为关系的维护端。 关系的维护端负责外键字段(记录)的更新; 关系的被维护端是没有权力更新外键字段(记录)的。
*/
@Id @GeneratedValue
private int id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private float price;
@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
@JoinColumn(name="order_id")
private Order_ order;
// getter and setter
}
老师和学生是多对多关系,一个学生有多个老师,一个老师也有多个学生,构建实体Teacher和Student:
@Entity
public class Teacher {
@Id @GeneratedValue
private Integer id;
@Column(length = 30, nullable = false)
private String name;
// 关系被维护端
@ManyToMany(mappedBy = "teachers", cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
private Set<Student> student = new HashSet<Student>();
// getter and setter
}
@Entity
public class Student {
@Id @GeneratedValue
private Integer id;
@Column(length=30,nullable=false)
private String name;
//一般在多对多很少用到级联的操作。
/**
* inverseJoinColumns关系被维护端的外键在中间表中的定义
* JoinColumns 关系维护端的外键在中间表中的定义
*/
@ManyToMany(cascade=CascadeType.REFRESH)
@JoinTable(name="student_teacher"
,inverseJoinColumns=@JoinColumn(name="teacherid")
,joinColumns=@JoinColumn(name="studentid"))
private Set<Teacher> teachers=new HashSet<Teacher>();
// getter and setter
}
@Entity
public class Couple {
@EmbeddedId
private CouplePK couple;
private String address;
// getter and setter
}
复合类:必须为public,实现Serializable,由无参构造函数
@Embeddable
public class CouplePK implements Serializable {
private Person husband;
private Person wife;
public CouplePK() {}
//getter and setter
}
构建好实体后,通过Persistence.createEntityManagerFactory("test")加载hibernate即可创建对应的表。
分享到:
相关推荐
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第15讲 JPA中的联合主键.avi
JPA中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等
主要介绍了Spring Data Jpa 复合主键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
基于jpa的一对一的主键测试.docx
JPA映射关系,多种映射关系的图解,适合EJB初学者,对JPA映射关系的了解.
15_传智播客JPA详解_JPA中的联合主键.rar
NULL 博文链接:https://1028826685.iteye.com/blog/1525788
第一个就是简单的单字段主键类型,一个就是复杂的复合主键类型。我们分2种情况分别讨论。 第一种单字段主键类型,看上去简单,无非就是一个id字段呗,实际上这个主键字段在JPA,还有任何的ORM框架中都是有很多种生成...
JPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAP
JPA常用关系实现例子:一对一,一对多,多对一,多对多关系实现代码。
04_JPA详解_第一个JPA实例与JPA主键生成策略.zip
针对JPA资料进行整理,根据传智播客的教学视频,边看边写,文档包含了jpa的基本概念,相关注解解释,及一些增删改查的demo。本文档方便了对jpa的学习与复习,快速掌握基本操作。
15_JPA详解_JPA中的联合主键.zip 15_JPA详解_JPA中的联合主键.zip
NULL 博文链接:https://profound-accumulation.iteye.com/blog/2242299
本文档简单描述了注解实现联合主键类的生成
JPA视频_映射双向一对多的关联关系 · 15. JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询...
04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略
10_JPA详解_JPA中的一对多双向关联与级联操作.zip
Spring Boot使用spring-data-jpa配置Mysql多数据源,可用版本
jpa映射关系详解[参照].pdf