`

JPA 一对多实例配置

    博客分类:
  • JPA
阅读更多
<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">
   <persistence-unit name="mengya" transaction-type="RESOURCE_LOCAL">
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
         <property name="hibernate.hbm2ddl.auto" value="update"/>
         <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="123"/>
         <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/mp?useUnicode=true&amp;characterEncoding=UTF-8"/>
      </properties>
   </persistence-unit>
</persistence>

 在JPA中双向一对多关系则多方为关系护端即负责外键记录的更新,一方为被维护端即没有权力更新外键记录

src下在面的META-INF/persistence.xml配置如下:

 

 

订单和订单项两个实例实体Bean如下:

订单表:

package com.mengya.bean;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "orders")
public class Order {
	private String orderId;

	private Float amount = 0f;// 设置默认值

	private Set<OrderItem> items = new HashSet<OrderItem>();

	@Id
	@Column(length = 32)
	public String getOrderId() {
		return orderId;
	}

	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}

	@Column(nullable = false)
	public Float getAmount() {
		return amount;
	}

	public void setAmount(Float amount) {
		this.amount = amount;
	}

	// cascade表示级联操作
	// CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
	// CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据
	// CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
	// CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法
	// FetchType.LAZY表示懒加载。对于xxxtoMany时即获得多的一方fetch的默认值是FetchType.LAZY懒加载。对于xxxtoOne时即获得一的一方fetch的默认值是FetchType.EAGER立即加载
	// mappedBy表示关系统被维护端,它的值是关系维护端维护关系的属性
	@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
			CascadeType.REMOVE }, fetch = FetchType.LAZY, mappedBy = "order")
	public Set<OrderItem> getItems() {
		return items;
	}

	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}

	/**
	 * 自己的加的一个方法,为了方便添加OrderItem
	 * 
	 */
	public void addOrderItem(OrderItem item) {
		item.setOrder(this);
		this.items.add(item);
	}

}

 订单项表:

package com.mengya.bean;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class OrderItem {
	private Integer id;

	private String productName;

	private Float sellPrice = 0f;// 设置默认值

	private Order order;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(length = 40, nullable = false)
	public String getProductName() {
		return productName;
	}

	public void setProductName(String productName) {
		this.productName = productName;
	}

	@Column(nullable = false)
	public Float getSellPrice() {
		return sellPrice;
	}

	public void setSellPrice(Float sellPrice) {
		this.sellPrice = sellPrice;
	}

	// cascade表示级联。CascadeType.REFRESH级联刷新
	// optional表示该对象可有可无,它的值为true表示该外键可以为null,它的值为false表示该外键为not null
	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, optional = false)
	// JoinColumn表示外键的列
	@JoinColumn(name="orderId")
	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}

}

 

测试:

package com.mengya.junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.Test;

import com.mengya.bean.Order;
import com.mengya.bean.OrderItem;


public class JPA_OnetoManyTest {
	@Test public void save(){
		EntityManagerFactory factory=Persistence.createEntityManagerFactory("mengya");
		EntityManager em=factory.createEntityManager();
		em.getTransaction().begin();
		
		Order order=new Order();
		order.setOrderId("200910120001");
		order.setAmount(450f);
		
		OrderItem item1=new OrderItem();
		item1.setProductName("篮球");
		item1.setSellPrice(220f);
		OrderItem item2=new OrderItem();
		item2.setProductName("排球");
		item2.setSellPrice(230f);
		order.addOrderItem(item1);
		order.addOrderItem(item2);
		
		em.persist(order);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
}

 

  • JPA_OneToMany.rar (8.1 KB)
  • 描述: JPA 一对多实例配置实例
  • 下载次数: 309
分享到:
评论
4 楼 superheizai 2010-01-04  
同意楼上的,cascade.refresh和cascade.persist弄反了。
3 楼 tishian 2009-11-26  
这段代码非常经典,二楼说的那个地方应该是刚好交叉了,调换一下位置即可.
如果我没有记错的话,应该是从黎活明的巴巴运动网中拿出来的吧...
2 楼 xiaobojava 2009-10-13  
EntityManager对象有一个refresh方法,该方法需要传一个实体对象,即从数据库重新查询加载该对象的属性。级联刷新表示当我用EntityManager的refresh方法重新加载Order方法时也同时加载Order中的items集合里面的orderItem对象。
1 楼 daquan198163 2009-10-13  
红字部分我看不懂
xiaobojava 写道

在JPA中双向一对多关系则多方为关系护端即负责外键记录的更新,一方为被维护端即没有权力更新外键记录

src下在面的META-INF/persistence.xml配置如下:



订单和订单项两个实例实体Bean如下:

订单表:

package com.mengya.bean;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = &quot;orders&quot;)
public class Order {
private String orderId;

private Float amount = 0f;// 设置默认值

private Set items = new HashSet();

@Id
@Column(length = 32)
public String getOrderId() {
return orderId;
}

public void setOrderId(String orderId) {
this.orderId = orderId;
}

@Column(nullable = false)
public Float getAmount() {
return amount;
}

public void setAmount(Float amount) {
this.amount = amount;
}

// cascade表示级联操作
// CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
// CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据
// CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
// CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法
// FetchType.LAZY表示懒加载。对于xxxtoMany时即获得多的一方fetch的默认值是FetchType.LAZY懒加载。对于xxxtoOne时即获得一的一方fetch的默认值是FetchType.EAGER立即加载
// mappedBy表示关系统被维护端,它的值是关系维护端维护关系的属性
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
CascadeType.REMOVE }, fetch = FetchType.LAZY, mappedBy = &quot;order&quot;)
public Set getItems() {
return items;
}

public void setItems(Set items) {
this.items = items;
}

/**
* 自己的加的一个方法,为了方便添加OrderItem
*
*/
public void addOrderItem(OrderItem item) {
item.setOrder(this);
this.items.add(item);
}

}

相关推荐

    JPA双向一对多实例配置

    JPA中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等

    JPA一对多双向配置实例

    **JPA一对多双向配置实例详解** 在Java Persistence API (JPA)中,"一对多"关系是数据库中常见的关联类型,它表示一个实体(如用户)可以与多个其他实体(如订单)相关联。本实例将深入探讨如何在JPA中配置一对多的...

    JPA一对一,一对多,多对多关系映射

    本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...

    springjpa 和 spring多视图配置实例

    本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...

    jpa例子jpajpa

    2. **实体管理工厂(EntityManagerFactory)**: 这是创建和配置JPA的入口点,通过它我们可以获取到`EntityManager`实例。一般在应用启动时创建,然后在整个应用生命周期内复用。 3. **实体管理器(EntityManager)*...

    JPA多对多Demo

    综上所述,“JPA多对多Demo”是一个全面展示多对多关联关系及其操作的实例。它涵盖了实体的配置、关联关系的建立、查询、持久化操作和事务管理等多个方面,对于理解JPA的多对多关联有很好的学习价值。通过这个示例,...

    jpa开发实例和文档

    **JPA文档**通常会详细讲解这些概念,包括如何配置JPA,如何创建和使用实体,如何执行查询,以及如何处理关联(如一对一、一对多、多对多)等。快速入门JPA的步骤可能包括安装和配置JPA供应商(如Hibernate、Eclipse...

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    总结来说,Spring Boot + JPA 的多数据源配置需要对Spring的配置机制有深入理解,包括自动配置、bean的创建、数据源的切换等。同时,合理组织实体类和数据库访问层,确保代码的可维护性和扩展性。这个名为`...

    JPA教程 JPA pdf文档,实例解析

    7. **关系映射**: JPA支持多种关系类型,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过`@JoinColumn`和`@JoinTable`注解可以指定关联表的细节。 8. **懒加载...

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

    在Java Persistence API (JPA) 中,多对多(ManyToMany)关系是表示两个实体之间复杂关联的一种方式。这种关联允许一个实体实例可以与多个其他实体实例相关联,反之亦然。例如,一个学生可以选修多门课程,一门课程...

    JPA实例 经典

    - **一对多(OneToMany)**: 一个实体对应多个实体,如部门与员工。 - **多对一(ManyToOne)**: 多个实体对应一个实体,如订单与客户。 - **多对多(ManyToMany)**: 多个实体可以关联多个实体,如学生与课程。 ...

    jpa 传智博客课件实例

    虽然描述中提到多对多和多对一的关系没有包含在内,但其他基本属性的映射应该是完整的。这可能包括实体类的定义、字段注解、主键设置、以及简单的CRUD(Create、Read、Update、Delete)操作。 **实体类与表的映射**...

    SpringDataJPA实例

    关于实体关联关系,SpringDataJPA支持多种关联类型,如一对一、一对多、多对一和多对多。以一对多为例,我们可以在`User`实体中定义一个`Set`类型的`Role`属性,表示用户可以拥有多个角色: ```java @Entity public...

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    4. **GenerationType.TABLE**: 使用数据库中的特定表来生成主键,这种方法对多个并发的请求更安全。 5. **GenerationType.UUID**: 生成全局唯一的UUID字符串作为主键,适用于分布式系统。 6. **GenerationType....

    Spring3.2_Hibernate4.2_JPA2全注解实例

    总的来说,这个实例涵盖了Spring 3.2的IoC和事务管理、Hibernate 4.2的ORM能力、JPA 2.0的注解驱动模型以及Ehcache的缓存优化,演示了一个完整的Java企业级应用的开发流程。开发者可以从中学习到如何设置和配置这些...

    jpa最基本最全配置的jar包

    8. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)和多对多(Many-to-Many)关系**: 这些是常见的关联关系,可以通过@OneToMany、@ManyToOne、@OneToOne和@ManyToMany注解进行配置。...

    jpa--9.单向多对一

    - 多对一关系中,如果删除"一"端的实体(Department),那么所有引用它的"多"端实体(Employee)的外键也将变为NULL,除非配置了级联操作。 通过这种方式,JPA允许我们在Java应用程序中轻松地处理数据库中的单向多...

    JPA 配置文件

    JPA及其配置文件不仅简化了Java应用的数据持久化过程,还提供了强大的多对多关系处理能力。通过实体类设计与XML映射文件的合理配置,开发者能以更加简洁高效的方式管理数据库数据,提升应用的开发效率和维护性。

    jpa--10.单向一对多

    在JPA_test1中,可能包含的是一个示例代码或者测试用例,用于演示如何配置和使用单向一对多的关系。通过这个例子,我们可以学习如何在实际项目中应用这些概念,以及如何进行数据的增删改查操作。

    hibernate一对多实例

    【hibernate一对多实例详解】 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。在这个“hibernate一对多实例”中,我们将深入探讨如何在Hibernate中实现一对多的关系,这是一种...

Global site tag (gtag.js) - Google Analytics