JPA一对多双向配置实例
来源:互联网 发布:活了一百万次的猫 知乎 编辑:程序博客网 时间:2024/06/14 05:13
在JPA中双向一对多关系则多方为关系护端即负责外键记录的更新,一方为被维护端即没有权力更新外键记录
src下在面的META-INF/persistence.xml配置如下:
<?xml version="1.0"?><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="itcast" 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="root" /><property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8" /><property name="hibernate.hbm2ddl.auto" value="update" /></properties></persistence-unit></persistence>
订单和订单项两个实例实体Bean如下:
订单表
@Table(name="t_order")@Entitypublic class Order {private String orderId;/**设置默认值*/private Float amount = 0f;/** * 一对多也可以使用List(使用xml配置稍微麻烦一些),并不一定要用Set,如果多的一方是要排序输出的, * 则使用ArrayList可以方便一些。一定程度上Set比List性能好,所以一般情况下都是使用Set较多 */private Set<OrderItem> items = new HashSet<OrderItem>();@Id@Column(length = 12)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.REFRESH, CascadeType.PERSIST, CascadeType.MERGE, 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);} }
订单项表:
/** * 1-m * 多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权力更新外键记录 * */@Table(name="t_orderItem")@Entitypublic class OrderItem {private Integer id;private String productName;private Float sellPrice = 0f;private Order order;@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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;}}测试:
public class OneToManyTest {static EntityManagerFactory factory = null;EntityManager em=null;@BeforeClasspublic static void setUpBeforeClass() throws Exception {factory=Persistence.createEntityManagerFactory("itcast");}@Testpublic void save() {em=factory.createEntityManager();em.getTransaction().begin();Order order=new Order();order.setAmount(5000f);order.setOrderId("20140908");OrderItem orderItem1=new OrderItem();orderItem1.setProductName("pc");orderItem1.setSellPrice(4000f);OrderItem orderItem2=new OrderItem();orderItem2.setProductName("phone");orderItem2.setSellPrice(1000f);order.addOrderItem(orderItem1);order.addOrderItem(orderItem2);em.persist(order);em.getTransaction().commit();factory.close();}}
mysql数据表:
一对多关系映射图:
说明:本人于ITEYE创建于2013年,现转移到CSDN
0 0
- JPA一对多双向配置实例
- JPA 一对多实例配置
- JPA---双向一对多
- Hibernate一对多双向注解配置实例
- JPA 一对多双向关联
- JPA配置一对多双向并且外键中含联合主键
- [记录]JPA双向关联一对多
- JPA一对多的双向关联
- JPA 菜鸟教程 5 双向一对多
- JPA映射关联关系-双向一对多
- JPA双向一对多和多对一及自关联实例
- jpa的单项一对多,双向一对多
- JPA之JPA中的一对多双向关联
- JPA的双向一对多和双向一对一关联关系
- jpa 双向一对多,多对一关联关系
- JPA双向一对多和多对一
- 无限级的双向一对多JPA映射(产品分类)
- 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多
- 第三章:基本概念
- 第十章:Shiro的Cache
- 数据库的隔离级别
- 重载、覆盖和隐藏的区别
- vim+ctags+cscope+taglist+nerdtree
- JPA一对多双向配置实例
- 谈一谈float
- Linux本地磁盘(硬盘)介绍
- JS笔记:undefined和null
- 顺序队列的初始化
- 第四章:变量、作用域和内存问题
- Android intent 显示和隐士意图
- 单例模式几种实现方式
- Ubuntu下启动、停止、重启MySQL,查看错误日志命令大全.note