`
1028826685
  • 浏览: 941016 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

JPA中的一对多双向关联与级联操作

阅读更多
在编写程序前导入相应的*.jar包已经数据库的驱动包,配置persistence.xml配置文件

JPA规范:一对多 多的一方为关系维护端 它们互相持有对方的引用  谁是关系维护端谁负责外键维护,被维护端没有权利对外键操作 外键在关系维护端


<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<!-- 以transaction-type下是 事务提交类型有两种事务:第一、本地事务(在同一个数据库中完成事务)  第二、全局事务(在不同数据库中需要在同一事务中完成不同数据库的操作)-->
<persistence-unit name="person" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 使用的方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" />
<!-- 数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!-- 数据库密码 -->
<property name="hibernate.connection.password" value="liyong" />
<!-- 数据库连接url -->
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/student?useUnicode=true&amp;characterEncoding=UTF-8" />
<!-- 表结构发生变化的时候更新表结构 ,表不存在是创建表-->
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>



本例来自itcast

第一步:编写一个Order。java和OrderItem.java

Order。java

@Entity
@Table(name="orders")
public class Order {

private String orderId;
private Float account=0f;
private Set<OrderItem> orderItem=new HashSet<OrderItem>();

/** CascadeType.REFRESH 级联刷新
*  CascadeType.PERSIST 级联插入,只有在调用persist方法时才有作用
*  CascadeType.MERGE 级联更新,只有在调用merge方法时才有作用
*  CascadeType.REMOVE 级联删除,只有在调用remove方法时才有作用
*  CascadeType.All 包括全部
*  fetch=FetchType.LAZY延迟加载(在many情况下,默认是延迟加载,在one情况下,默认是立即加载)
*  mappedBy="order"表示这个类是 关系被维护端,指明该实体内被维护的属性为order
**/
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY,mappedBy="order")

public Set<OrderItem> getOrderItem() {
return orderItem;
}
public void setOrderItem(Set<OrderItem> orderItem) {
this.orderItem = orderItem;
}
@Id @Column(length=10)
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
@Column(nullable=false)
public Float getAccount() {
return account;
}
public void setAccount(Float account) {
this.account = account;
}

public void addOrderItem(OrderItem orderItem)
{
orderItem.setOrder(this);
this.orderItem.add(orderItem);
}
}


OrderItem.java

@Entity
public class OrderItem {

private String produce;
private Float priceProduce=0f;
private Integer id;
private Order order;

@Column(length=20,nullable=false)
public String getProduce() {
return produce;
}
public void setProduce(String produce) {
this.produce = produce;
}
@Column(nullable=false)
public Float getPriceProduce() {
return priceProduce;
}
public void setPriceProduce(Float priceProduce) {
this.priceProduce = priceProduce;
}
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
     * 多的一方不需要 级联保存,不需要级联删除
     * optional=true表示可选,表示此项可以为空
**/
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=true)
@JoinColumn(name="oerder_id")//外键名称order_id
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}


}

第二步:编写单元测试

@Test
public void save()
{
EntityManagerFactory factory=Persistence.createEntityManagerFactory("person");
EntityManager entity=factory.createEntityManager();
entity.getTransaction().begin();

Order order=new Order();
order.setAccount(100f);
order.setOrderId("111");

OrderItem orderItem=new  OrderItem();
orderItem.setPriceProduce(300f);
orderItem.setProduce("篮球");

OrderItem orderItem1=new  OrderItem();
orderItem1.setPriceProduce(300f);
orderItem1.setProduce("足球");

order.addOrderItem(orderItem);
order.addOrderItem(orderItem1);

entity.persist(order);
entity.getTransaction().commit();
entity.close();
factory.close();
}

第三:运行单元测试生成表结构两张表见数据库

代码见附件:

分享到:
评论

相关推荐

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...

    JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi

    JPA中的多对多双向关联实体定义与注解设置

    总结来说,JPA中的多对多双向关联实体定义涉及`@ManyToMany`、`@JoinTable`以及`mappedBy`等注解的使用。正确配置这些注解可以让我们轻松地管理实体之间的复杂关系,并简化数据库操作。在实际项目中,理解并熟练掌握...

    13_jpa多对多双向关联实体定义与注解

    "13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与注解设置"这一部分则专门聚焦于多对多关联的实践。 在关系型数据库中,多对多关联是最为复杂的一种关系...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...

    12_JPA详解_JPA中的一对一双向关联.zip

    在Java世界中,Java Persistence API(JPA)是用于管理和持久化对象的规范,它使得开发者可以方便地在...在实际项目中,结合其他关联类型,如一对多、多对一、多对多,可以构建出更加灵活、符合业务逻辑的数据模型。

    14_JPA详解_JPA中的多对多双向关联的各项关系操作.zip

    在本教程中,我们将深入探讨JPA中的多对多双向关联及其各项操作。 ### 1. 多对多关联基础 在关系型数据库中,多对多关联通常通过中间表来实现,而JPA提供了一种声明式的方式来处理这种关联。在双向关联中,两个...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    Hibernate annotation JPA 一对多,多对多

    同时,还需要在`Teacher`类中添加一个`List&lt;Student&gt;`字段,用`@OneToMany`注解来实现一对多关系,形成双向关联。 3. **多对多关系**: 学生和班级的关系可以是多对多,因为一个学生可以属于多个班级,反过来,一...

    jpa--11.双向一多

    **JPA 双向一对多关系详解** 在Java Persistence API(JPA)中,数据建模是通过实体类和它们之间的关联来实现的。在实际的业务场景中,经常会出现两个实体之间存在一对多(One-to-Many)的关系,比如一个用户可以有...

    JPA实体关联(hibernate实现)

    一对多关联意味着一个实体可以与多个其他实体相关联。例如,一个学生可以有多个课程。在JPA中,我们使用`@OneToMany`注解来定义这种关系。默认情况下,关联是不级联的,可以通过`cascade=CascadeType...`来指定级联...

    传智播客JPA学习笔记.pdf

    JPA中的一对多双向关联与级联操作(一对多关系:一)** 在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 *...

    jpa 关联映射jpa 关联映射jpa 关联映射

    本文将深入探讨 JPA 中的一对一 (One-to-One)、一对多 (One-to-Many)、多对一 (Many-to-One) 和多对多 (Many-to-Many) 的关联映射。 #### 二、实体关系映射概述 在领域模型中,实体间的关系可以是: - **一对一 ...

    JPA学习总结(三)--JPAOneToMany双向关联

    在本篇《JPA学习总结(三)--JPAOneToMany双向关联》中,我们将深入探讨Java Persistence API (JPA)中的OneToMany关系映射,这是一种在数据库表之间建立一对多关联的方式。JPA作为ORM(对象关系映射)框架,允许我们...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    2. **一对多(OneToMany)**: 一个实体可以与多个其他实体相关联,如一个班级有多个学生。使用`@OneToMany`注解,可以设置`fetch`策略(默认为`LAZY`,表示延迟加载)和`cascade`属性(如`CascadeType.ALL`,表示...

    jpa的实体映射关系7种

    双向一对多关系中,一方实体可以拥有多个另一方实体,而另一方实体也知晓这个关系。双方都需要使用`@OneToMany`和`@ManyToOne`注解来定义关系,且`mappedBy`应设置在`@OneToMany`的一侧。 5. **双向多对一**: 相...

Global site tag (gtag.js) - Google Analytics