- 浏览: 529618 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (294)
- Java基础 (40)
- 架构分析 (37)
- 开发心得 (22)
- 架构乐园 (12)
- Java Web (6)
- 大牛专区 (5)
- 转载专区 (40)
- 小技巧 (16)
- Linux专区 (8)
- linux (3)
- Spring (2)
- N (1)
- 前台JS (1)
- SAP NETWEAVER (3)
- JMS (4)
- queue (1)
- 数据模型 (2)
- oracle (2)
- sqlserver (2)
- ubuntu (2)
- install gcc (1)
- MEMCACHED (2)
- SQLSERVER 驱动 (1)
- JVM GC 调优 (1)
- 服务器运维 (1)
- activiti 国际化 中文 (1)
- activiti (1)
- 前端开发 (1)
- tar.gz (1)
- Web安全 (1)
- CSRF (1)
- 技术架构 (4)
- 性能指标 (1)
- 响应时间 (1)
- 淘宝 (1)
- linux安装 (1)
- lucene (1)
- Mongodb (1)
- gis (1)
- 微信授权 code access_token open_id (1)
- Redis java 获取 (1)
- HTTP 跨域 同源策略 cookie (1)
- java 加密 3DES (1)
- CROS (1)
- Cookie (1)
- Rest (1)
- 跨域资源共享 (1)
- 3DES (1)
- Effective java读后感 (1)
- nginx (1)
- Tengine 开发 (1)
- HTTP/1.1 废弃 javaWEB (1)
- 支付宝 支付状态 (1)
- maven jdk (1)
- 应用宝统一链接 (1)
- git (2)
- git 代码上传 (1)
- ubuntu 安装 mysql 5.6 (1)
- Linux 命令学习 (3)
- Linux 命令 60 (2)
- linux 命令 (2)
- linux nginx 安装 (1)
- grant revoke (1)
- linxu jdk profile (1)
- git 使用 (1)
- 架构设计 (1)
- 上海居转户 居转户 (1)
- wind (1)
- elastic-job (1)
- Mysql (1)
- 个人站点 (1)
- nginx lua waf 实现 (1)
- github 算法指南 (1)
- go (1)
- MapReduace 大数据 (1)
- 架构PPT (1)
最新评论
-
jingchh:
帅哥, 这个类是哪个包下面的呢? 应该下载哪个jar包,谢谢~ ...
StringUtils工具类的常用方法 -
Nabulio:
StringUtils工具类的常用方法 -
yuanyuan2597:
那请问,按照你的方法进行修改调用。SELECT locatio ...
根据经纬度实现附近搜索Java实现 -
yangguo:
这个经理有病,埋伏打他一顿。
复试 等电话 -
emparadise329:
进一步学习了子类与父类间的关系
Java 子类对象实例化 面试题
package cn.itcast.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.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name="orders") //把表名改成orders(默认表名是order),防止默认表名order与数据库的关键字"order by"中的order冲突。不改的话测试不成功,出现异常,orderitem表建立成功,order表建不了。 public class Order { private String orderId; private Float amount = 0f; private Set<OrderItem> items = new HashSet<OrderItem>(); @Id //要注意:目前JPA规范并没有提供UUID这种生成策略,目前主键值只提供了整型的生成方式,所以@GeneratedValue这个注解就不能在这里用上,不能对字符串进行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; } @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE },fetch=FetchType.LAZY,mappedBy="order") //mappedBy="order",中的order是关系维护端的order属性,这个order属性的类型是这个bean。 public Set<OrderItem> getItems() { return items; } /* @OneToMany(fetch=FetchType.)的选项有,如下图: FetchType.EAGER:代表立即加载; FetchType.LAZY:代表延迟加载。 当我们把fetch设置为FetchType.LAZY的时候,什么时候初始化items里面的数据呢?当我们第一次访问这个属性,并对这个属性进行操作的时候,这个集合的数据才会从数据库里面load出来。但要注意:当我们访问这个延迟属性的时候,我们的前提要EntityManager这个对象没有被关闭,如果被关闭了我们再去访问延迟属性的话,就访问不到,并抛出延迟加载意外。 如果没有设置fetch这属性的话,会怎么样呢?是立即加载?还是延迟加载呢? 记住@OneToMany这个标签最后的英文单词,如果是要得到Many的一方,我不管你前面是什么,只要后面的单词是Many,也就是说要得到多的一方,你们就给我记住,默认的加载策略就是延迟加载(Many记录可能上几万条,立即加载的话可能对效率影响大,所以延迟加载)。 反过来,如果后面是One呢?因为它是加载一的一方,这对性能影响不是很大,所以它的默认加载策略是立即加载。 mappedBy:我们怎么知道关系的维护端和被维护端呢?当然JPA规范规定多的一端应该是为维护端(关系维护段增加一个字段为外键,里面保存的是一的一端的主键),一的一端为关系被维护端,那么我们总要在程序里给他们打上标志吧?虽然规范是这么规定,但总要申明一下吧?就是通过mappedBy属性,只要哪个类出现了mappedBy,那么这个类就是关系的被维护端。里面的值指定的是关系维护端。 orderItem这边由哪一个属性去维护关系呢?是OrderItem类的order属性。 mappedBy属性对应Hibernate里面的inverse属性:<SET name="items" inverse="true"></SET> */ public void setItems(Set<OrderItem> items) { this.items = items; } //用这个方法会方便很多 public void addOrderItem(OrderItem orderItem){ orderItem.setOrder(this); //关系维护方orderItem加入关系被维护方(this)后,才能维护更新关系(orderItem表中的外键字段order_id),维护关系其实就是更新外键。只有为关系维护端设置了关系被维护端,关系才能建立起来。 this.items.add(orderItem); } }
OrderItem.java
package cn.itcast.bean; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; 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; //默认值为0。 private Order order; @Id @GeneratedValue //id自增长方式生成主键。 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; } @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false) @JoinColumn(name="order_id") //设置外键的名称。 public Order getOrder() { //OrderItem是关系维护端,负责关系更新,它是根据它的order属性值维护关系的。当它保存的时候(主动保存或是被级联保存),他会根据order属性的值更新关系,当order为null时,就不会更新关系了。级联操作也是根据双方对象中的映射属性值进行的,当映射属性没值的时候就不会对对方进行级联操作了。 return order; } /* @ManyToOne的级联保存(CascadeType.PERSIST)是不需要的,不可能说你保存某个订单项OrderItem的时候,也保存订单Order的。通常都是保存订单Order的时候,保存订单项OrderItem的。 CascadeType.MERGE:如果我们更新了订单项orderItem产品的价钱,那么整个订单Order的总金额是会发生改变的,所以可以定义这个级联更新。 CascadeType.REFRESH:如果我们想得到目前数据库里orderItem最新的数据的话,我们也希望得到订单order的最新数据,我们可以定义这个级联刷新,就是说把数据库里最新的数据重新得到。 CascadeType.REMOVE:这个属性这里肯定不设。就好比现在有一个订单,一个订单里面有3个购物项orderItem,买了A,B,C三个产品,我现在不要A这个产品了,我们只是把A这条记录删掉,那么如果这里定义了级联删除的话,那么你删除A记录的同时,也会把整个订单也删除掉,所以这里不需要设级联删除。 */ //optional:说明order这个是否是可选的?是否可以没有的?false表示必须的,true表示是可选的。 public void setOrder(Order order) { this.order = order; } }
OneToManyTest.java
package junit.test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.BeforeClass; import org.junit.Test; import cn.itcast.bean.Order; import cn.itcast.bean.OrderItem; public class OneToManyTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void save() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Order order = new Order(); order.setAmount(34f); order.setOrderId("992"); //orderId是数据库里面的主键,同时也是实体的标识。这里并没有使用Id自增长的方式来生成主键值,而是自己设值,所以可以随便写。如果想用UUID,可以这样写UUID.randomUUID().toString();这个类JDK5提供了。 OrderItem orderItem1 = new OrderItem(); orderItem1.setProductName("排球"); orderItem1.setSellPrice(90f); OrderItem orderItem2=new OrderItem(); orderItem2.setProductName("篮球"); orderItem2.setSellPrice(30f); order.addOrderItem(orderItem1); order.addOrderItem(orderItem2); em.persist(order); em.getTransaction().commit(); em.close(); factory.close(); } }
运行junit测试,发现保存订单Order的时候,也保存了订单项OrderItem.为什么呢?是因为订单Order和订单项OrderItem定义 了级联保存(CascadeType.PERSIST)关系,这个级联关系在我们调用em.persist(order);的persist方法时就会起 作用。
发表评论
-
js chart
2013-08-26 15:12 842收藏 1:http://www.fusioncharts. ... -
netweaver7.3 应用context-root 根目录
2013-04-27 19:03 1197Developing a Custom Logo ... -
Java Web 胡言乱语 之四---application对象
2012-04-24 09:57 14051,application对象: String ... -
Java Web 胡言乱语 之三
2012-04-23 11:01 1119requst.getContextPath() 取得 ... -
Java Web 胡言乱语 之二
2012-04-20 13:31 971一,九大内置对象: No. 内置 ...
相关推荐
本教程“11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护”聚焦于JPA在处理一对多关系时的延迟加载机制以及如何有效地维护这些关系。 一、JPA一对多关系 在数据库中,一对多关系意味着一个实体可以与多个其他...
本资料主要探讨的是JPA中的一对多关系以及延迟加载机制,这两部分是JPA使用中的关键概念。 **一对多关系** 在关系数据库中,一对多关系是最常见的一种关联类型。例如,一个部门可以有多名员工,而每个员工只能属于...
**JPA一对多和多对一关系详解** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式来操作数据库。在JPA中,实体间的关系映射是核心概念之一,...
JPA中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等
在Java Persistence API (JPA) 中,一对多关联是一种常见的关系映射,它表示一个实体可以与多个其他实体相关联。这种关联在数据库层面通常通过外键实现,而在JPA中,我们通过注解来配置这种关系。这篇博客将深入探讨...
在JPA中,如果我们有一个实体类与另一个实体类有一对多或多对一的关系,我们可以通过设置`@OneToMany`或`@ManyToOne`注解的`fetch`属性为`LAZY`来实现延迟加载。这样,当首次加载实体时,与其关联的其他实体并不会...
JPA中的一对多延迟加载与关系维护(一对多关系:二)** 一对多关系的延迟加载是通过fetch属性设置的,默认是懒加载,只有在访问子集合时才会加载。关系维护涉及关联的维护策略,如UNIQUENESS和OWNED。 **12. JPA中...
JPA提供了多种方式来映射实体之间的关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)。 - **一对一(One-to-One)**:这种关系在两个实体之间建立一对一的...
本文将深入探讨JPA中的四种主要关联关系:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。 1. **一对一关联(OneToOne)** 在一对一关联中,一个实体实例对应数据库中的唯...
它为Java开发者提供了一种方式,将对象模型与关系数据库模型进行映射,从而避免了直接编写SQL语句,提高了代码的可读性和可维护性。JPA是Java EE和Java SE应用程序的标准API,其规范由JSR-220定义。 在JPA中,"to ...
2. **一对多(OneToMany)**: 一个实体可以与多个其他实体相关联,如一个班级有多个学生。使用`@OneToMany`注解,可以设置`fetch`策略(默认为`LAZY`,表示延迟加载)和`cascade`属性(如`CascadeType.ALL`,表示...
- 延迟加载(`@Lazy`)是处理一对多关联时的一个重要特性,有助于优化性能。 - **多对多关联**: - 多对多关系通过`@ManyToMany`注解表示,并且通常需要通过`@JoinTable`指定连接表。 - 这种关联方式可以表示两个...
本话题主要关注JPA中的“多对一”关系,这是一种常见的关联映射类型,适用于一个实体可以与多个其他实体相关联,而另一个实体只能与一个实体关联的情况。 在JPA中,"多对一"关系可以通过在实体类中定义`@ManyToOne`...
例如,`@Entity`表示一个类是实体,`@Id`表示主键字段,`@ManyToOne`表示多对一的关系等。 4. **缓存机制**:JPA提供了一级缓存和二级缓存,分别用于缓存实体对象和查询结果,提高应用程序的性能。 5. **事件监听器*...
8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解实现。 9. **懒加载和级联操作**:懒加载可以延迟加载关联的对象,直到真正需要时才...
9. **@OneToOne, @OneToMany, @ManyToMany**:这三种注解分别用于定义一对一、一对多和多对多的关系映射,它们也包含fetch和cascade属性,以处理关联对象的加载和操作。 10. **@JoinColumn, @JoinTable**:这两个...
在Hibernate中,延迟加载主要应用于一对多、多对一、多对多的关联关系。默认情况下,如果实体间的关联配置为“fetch=FetchType.LAZY”,那么关联的对象会在第一次访问或需要时进行加载,这就是所谓的“懒加载”。 *...
- **一对多(OneToMany)**: 一个实体对应多个实体实例。 - **多对一(ManyToOne)**: 多个实体对应一个实体实例。 - **多对多(ManyToMany)**: 多个实体对应多个实体实例,通常需要一个关联表来维护关系。 6. ...
JPA支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解,可以定义实体间的关联。 **懒...