<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&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中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等
**JPA一对多双向配置实例详解** 在Java Persistence API (JPA)中,"一对多"关系是数据库中常见的关联类型,它表示一个实体(如用户)可以与多个其他实体(如订单)相关联。本实例将深入探讨如何在JPA中配置一对多的...
本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...
本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...
2. **实体管理工厂(EntityManagerFactory)**: 这是创建和配置JPA的入口点,通过它我们可以获取到`EntityManager`实例。一般在应用启动时创建,然后在整个应用生命周期内复用。 3. **实体管理器(EntityManager)*...
综上所述,“JPA多对多Demo”是一个全面展示多对多关联关系及其操作的实例。它涵盖了实体的配置、关联关系的建立、查询、持久化操作和事务管理等多个方面,对于理解JPA的多对多关联有很好的学习价值。通过这个示例,...
**JPA文档**通常会详细讲解这些概念,包括如何配置JPA,如何创建和使用实体,如何执行查询,以及如何处理关联(如一对一、一对多、多对多)等。快速入门JPA的步骤可能包括安装和配置JPA供应商(如Hibernate、Eclipse...
总结来说,Spring Boot + JPA 的多数据源配置需要对Spring的配置机制有深入理解,包括自动配置、bean的创建、数据源的切换等。同时,合理组织实体类和数据库访问层,确保代码的可维护性和扩展性。这个名为`...
7. **关系映射**: JPA支持多种关系类型,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过`@JoinColumn`和`@JoinTable`注解可以指定关联表的细节。 8. **懒加载...
在Java Persistence API (JPA) 中,多对多(ManyToMany)关系是表示两个实体之间复杂关联的一种方式。这种关联允许一个实体实例可以与多个其他实体实例相关联,反之亦然。例如,一个学生可以选修多门课程,一门课程...
- **一对多(OneToMany)**: 一个实体对应多个实体,如部门与员工。 - **多对一(ManyToOne)**: 多个实体对应一个实体,如订单与客户。 - **多对多(ManyToMany)**: 多个实体可以关联多个实体,如学生与课程。 ...
虽然描述中提到多对多和多对一的关系没有包含在内,但其他基本属性的映射应该是完整的。这可能包括实体类的定义、字段注解、主键设置、以及简单的CRUD(Create、Read、Update、Delete)操作。 **实体类与表的映射**...
关于实体关联关系,SpringDataJPA支持多种关联类型,如一对一、一对多、多对一和多对多。以一对多为例,我们可以在`User`实体中定义一个`Set`类型的`Role`属性,表示用户可以拥有多个角色: ```java @Entity public...
4. **GenerationType.TABLE**: 使用数据库中的特定表来生成主键,这种方法对多个并发的请求更安全。 5. **GenerationType.UUID**: 生成全局唯一的UUID字符串作为主键,适用于分布式系统。 6. **GenerationType....
总的来说,这个实例涵盖了Spring 3.2的IoC和事务管理、Hibernate 4.2的ORM能力、JPA 2.0的注解驱动模型以及Ehcache的缓存优化,演示了一个完整的Java企业级应用的开发流程。开发者可以从中学习到如何设置和配置这些...
8. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)和多对多(Many-to-Many)关系**: 这些是常见的关联关系,可以通过@OneToMany、@ManyToOne、@OneToOne和@ManyToMany注解进行配置。...
- 多对一关系中,如果删除"一"端的实体(Department),那么所有引用它的"多"端实体(Employee)的外键也将变为NULL,除非配置了级联操作。 通过这种方式,JPA允许我们在Java应用程序中轻松地处理数据库中的单向多...
JPA及其配置文件不仅简化了Java应用的数据持久化过程,还提供了强大的多对多关系处理能力。通过实体类设计与XML映射文件的合理配置,开发者能以更加简洁高效的方式管理数据库数据,提升应用的开发效率和维护性。
在JPA_test1中,可能包含的是一个示例代码或者测试用例,用于演示如何配置和使用单向一对多的关系。通过这个例子,我们可以学习如何在实际项目中应用这些概念,以及如何进行数据的增删改查操作。
【hibernate一对多实例详解】 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。在这个“hibernate一对多实例”中,我们将深入探讨如何在Hibernate中实现一对多的关系,这是一种...