- 浏览: 406774 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (325)
- 数据中台 (15)
- 设计模式 (7)
- 数据结构 (4)
- JavaScript (51)
- 网页设计与制作 (7)
- Flex (4)
- Fckeditor (7)
- Struts (12)
- Spring (19)
- Hibernate (14)
- EJB3.0 (19)
- Java EE 6 (2)
- JSP (22)
- 辅助框架 (9)
- WebService (1)
- XML (8)
- 正则表达式 (5)
- 并发(多线程) (2)
- Java网络 (10)
- 开发工具 (25)
- Oracle (15)
- MySQL (8)
- Git (4)
- SQL Server (2)
- C# (9)
- php (14)
- asp (2)
- ColdFusion (5)
- Tex (1)
- 云游戏 (1)
最新评论
-
CSDNBenbenChong:
...
SQL里desc和asc是什么意思 -
雪狐一号:
非常好 顶一个
SQL里desc和asc是什么意思 -
boyleichinasoft:
thinking...
该如何去使用设计模式呢? -
nforce_com:
写的很好,学习了!不过Student 一般情况下不会删除所有 ...
JPA多对多 -
TaoistWar:
那是FCKEditor的,详细信息只能查看官方文档,或者直接看 ...
1.fckeditor-java-2.5给上传图片添加水印
JPA中一对多和多对一双向关系中,多的一方为关系维护端 。有mappedBy的一方为关系被维护端。
关系维护端负责外键纪录的更新 ,关系被维护端是没有权力更新外键纪录的。只能通过关系维护端设置与关系被维护端的关系。
一对多:
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,
CascadeType.MERGE, CascadeType.REMOVE, CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "order")
cascade:设置级联操作,对JPQL语句进行的操作没有任何影响
CascadeType.PERSIST对应实体管理器的persist()方法
CascadeType.REFRESH对应实体管理器的refresh()方法
CascadeType.MERGE对应实体管理器的merge()方法
CascadeType.REMOVE对应实体管理器的remove()方法
CascadeType.ALL对应实体管理器的以上方法:persist()、refresh()、merge()、remove()方法
fetch:设置是否延迟加载,FetchType.LZAY为延迟加载, FetchType.EAGER时立即加载。如果加载的是多的一方的话,默认的是延迟加载,否则是加载。
多对一:
@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
@JoinColumn(name = "order_id")
optional:代表外键字段是否可以为空。true可以为空,false不可以为空。
@JoinColumn(name = "order_id"):设置关联外键字段的名称。
例:
1.两个实体的一对多和多对一
使用现实生活中的订单和订单项的关系,代码为:
package com.taoistwar.jpa.entity.onetomany; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name = "order_info") public class OrderInfo { private Integer id; private String name; private Set<OrderItem> items = new HashSet<OrderItem>(); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER, mappedBy = "order") //fetch是否延迟加载,mappedBy有它的一方为关系被维护端。 public Set<OrderItem> getItems() { return items; } public void setItems(Set<OrderItem> items) { this.items = items; } public void addOrderItem(OrderItem orderItem) { orderItem.setOrder(this); this.items.add(orderItem); } }
package com.taoistwar.jpa.entity.onetomany; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name = "order_item") public class OrderItem { private Integer Id; private String name; private OrderInfo order; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return Id; } public void setId(Integer id) { Id = id; } @Column(length = 20, nullable = true) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false) @JoinColumn(name = "order_id") // optional是否可以为空 public OrderInfo getOrder() { return order; } public void setOrder(OrderInfo order) { this.order = order; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((Id == null) ? 0 : Id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; OrderItem other = (OrderItem) obj; if (Id == null) { if (other.Id != null) return false; } else if (!Id.equals(other.Id)) return false; return true; } }
2.单个实体的一对多和多对一
使用软件开发中的模块为例子,代码如下:
package com.taoistwar.ejb.sys.entity; import java.io.Serializable; import java.util.Set; 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; import javax.persistence.OneToMany; import javax.persistence.Table; /** * @author TaoistWar 模块实体类 (一对多) * JPA中一对多和多对一双向关系中,多的一方为关系维护端。 * 关系维护端负责外键纪录的更新,关系被维护端是没有权力更新外键纪录的。 */ @Entity @Table(name = "s_moudle") public class Moudle implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; // 模块名(一般中文) @Column(name = "modName") private String modName; // 模块值(英文) @Column(name = "modValue") private String modValue; // 模块排序编码 @Column(name = "orderCode") private Integer orderCode; // 模块是否禁用 @Column(name = "forbidden") private boolean forbidden; // 模块链接路径 @Column(name = "modUrl") private String modUrl; // 父级模块 @ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.REMOVE }, optional=true) @JoinColumn(name="parent_id") // optional关联字段是否可以为空 private Moudle parent; // 子级模块 @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.REMOVE }, fetch=FetchType.LAZY, mappedBy="parent") private Set<Moudle> children; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getModName() { return modName; } public void setModName(String modName) { this.modName = modName; } public String getModValue() { return modValue; } public void setModValue(String modValue) { this.modValue = modValue; } public Integer getOrderCode() { return orderCode; } public void setOrderCode(Integer orderCode) { this.orderCode = orderCode; } public boolean isForbidden() { return forbidden; } public void setForbidden(boolean forbidden) { this.forbidden = forbidden; } public String getModUrl() { return modUrl; } public void setModUrl(String modUrl) { this.modUrl = modUrl; } public Moudle getParent() { return parent; } public void setParent(Moudle parent) { this.parent = parent; } public Set<Moudle> getChildren() { return children; } public void setChildren(Set<Moudle> children) { this.children = children; } }
发表评论
-
8.EJB3的拦截器(外部类)
2010-05-11 11:00 1091EJB3的拦截器的开步骤: 1.开发拦截器 使用@A ... -
Caused by: org.hibernate.HibernateException: unknown Oracle major version [0]
2010-02-24 09:34 1789昨天试了一下把mysql的数据源配置mysql-ds.xml放 ... -
detached entity passed to persist
2010-02-02 08:01 1727detached entity passed to persi ... -
实体的状态
2009-06-17 23:04 604新建状态:新建的实体对象,尚未拥有持久化主键,没有和一个持久化 ... -
EJB3的一些常见注解
2009-06-17 22:58 9350.实体管理器 @Persisten ... -
JPA一对多和多对一关系
2009-05-16 11:18 60421-m:多的一方为关系维护端,关系维护端负责外键纪录 ... -
JPA多对多
2009-05-16 10:38 8501维护端注解 @ManyToMany (cascade ... -
JPA(HIberante)环境的搭建
2009-04-19 14:18 19001.添加jar包 hibernate & jpa j ... -
6.2 配置JBoss数据源(Oracle10G)
2009-03-17 10:38 16281.配置数据源 <?xml version=" ... -
6.1 配置JBoss数据源(MS SQL Server2005)
2009-03-17 09:35 17511.SQL Server 2005 配置内容: <?xm ... -
8.开发消息驱动Bean
2009-03-13 22:59 10511.配置消息服务 <?xml version=&qu ... -
7.单表实体Bean
2009-03-09 23:47 1033(1):建表SQL语句(MySQL) ... -
6.配置JBoss数据源
2009-03-09 18:57 2399以MySQL为例: (1):添 ... -
5.开发有状态Bean
2009-03-05 23:37 8341.无状态Bean使用实例池技术管理Bean.性能 ... -
4.开发本地接口的无状态会话Bean
2009-03-05 23:03 820远程接口需要 ... -
3.通过ANT来提高应用的开发效率
2009-03-05 22:21 627<?xml version="1.0" ... -
2.开发EJB的客户端
2009-03-05 20:49 922EJB是业务层,通常被客户端调用,客户端可以是J ... -
1.EJB的HelloWorld!
2009-03-05 20:32 1735用Eclipse开发EJB需要用到EJB的类库 ...
相关推荐
JPA中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等
**JPA 2 一对多双向关联关系** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式操作数据库。在JPA中,一对多关联关系是常见的实体间关系类型...
在这个主题中,我们将深入探讨如何在JPA中定义和配置双向多对多关联实体,并通过注解进行设置。 首先,我们需要了解JPA中的几个关键注解: 1. `@Entity`:标记一个类作为JPA的实体类,使得该类可以被JPA管理并映射...
这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...
在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...
4. **注解细节**:`@JoinColumn`用于单向一对一或一对多关系,而在多对多关系中,通常使用`@JoinTable`来指定中间表的信息,包括表名、连接列等。 5. **操作关联**:在JPA中,可以通过添加或移除对象到集合属性来...
本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...
// 双向一对多关系配置 @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Order> orders; // getters and setters } ``` Order类则会包含一个对User的引用: ...
本文将深入探讨在JPA中如何实现双向多对多的关联关系,并提供相关的示例代码。 首先,我们需要了解多对多关联关系的基本概念。在关系型数据库中,两个实体之间可能存在多对多的关系,意味着每个实例可以从一个实体...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi
本示例中的“JPA多对多Demo”是一个具体的实践案例,展示了如何在JPA中实现多对多关联关系,以及对应的增删改查方法。 多对多关联是现实世界中常见的一种关系类型,例如教师和学生之间的关系,一个教师可以教多个...
**JPA 双向一对多关系详解** 在Java Persistence API(JPA)中,数据建模是通过实体类和它们之间的关联来实现的。在实际的业务场景中,经常会出现两个实体之间存在一对多(One-to-Many)的关系,比如一个用户可以有...
通过本教程,你可以学习到如何在JPA中设置和操作多对多双向关联,理解其背后的数据库操作,并掌握处理关联的技巧,从而更好地利用JPA进行数据持久化。在实际开发中,灵活运用这些知识能帮助你构建出更加高效和易于...
本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...
在Java世界中,Java Persistence API(JPA)是用于管理和持久化对象的规范,它使得开发者可以方便地在...在实际项目中,结合其他关联类型,如一对多、多对一、多对多,可以构建出更加灵活、符合业务逻辑的数据模型。
本资料“13_JPA详解_JPA中的多对多双向关联实体定义与注解设置”专注于讲解JPA如何处理多对多双向关联关系,这是数据库设计中常见的一种复杂关联类型。下面我们将详细探讨这一主题。 首先,我们需要理解多对多关联...
1. **关联类型:** Hibernate支持四种基本的关联类型,包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:**...
双向一对多关系中,一方实体可以拥有多个另一方实体,而另一方实体也知晓这个关系。双方都需要使用`@OneToMany`和`@ManyToOne`注解来定义关系,且`mappedBy`应设置在`@OneToMany`的一侧。 5. **双向多对一**: 相...
JPA视频_映射双向一对多的关联关系 · 15. JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询...