转@OneToMany或@ManyToOne的用法-annotation关系映射篇(上)

原文:http://blog.sina.com.cn/s/blog_6fef491d0100obdm.html

例如我们用一个例子来开启JPA的一对多和多对一的学习。

比如你去当当网上买书籍,当当网就给你一个订单。

 
通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们将将订单和订单项设计关系为(1:N)一对多的关系(排除0)。
得出关系我们就使用JPA来实现这个关系(关于建立JPA和基本的配置我就不再说了,如果不明白请看JPA入门篇)。

首先建立订单实体类

 1 import java.util.HashSet;
 2 import java.util.Set;
 3
 4 import javax.persistence.CascadeType;
 5 import javax.persistence.Column;
 6 import javax.persistence.Entity;
 7 import javax.persistence.Id;
 8 import javax.persistence.OneToMany;
 9 import javax.persistence.Table;
10
11 @Entity
12 @Table(name="orders")
13 public class Order {
14
15     private String orderid;
16     private Float amount = 0f;
17     private Set<OrderItem> items = new HashSet<OrderItem>();
18
19     @Id
20     @Column(length = 12)
21     public String getOrderid() {
22         return orderid;
23     }
24
25     public void setOrderid(String orderid) {
26         this.orderid = orderid;
27     }
28
29     @Column(nullable = false)
30     public Float getAmount() {
31         return amount;
32     }
33
34     public void setAmount(Float amount) {
35         this.amount = amount;
36     }
37
38     @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //这里配置关系,并且确定关系维护端和被维护端。mappBy表示关系被维护端,只有关系端有权去更新外键。这里还有注意OneToMany默认的加载方式是赖加载。当看到设置关系中最后一个单词是Many,那么该加载默认为懒加载
39     public Set<OrderItem> getItems() {
40         return items;
41     }
42
43     public void setItems(Set<OrderItem> items) {
44         this.items = items;
45     }
46
47          /**
48            *该方法用于向order中加order项
49           /*
50     public void addOrderItem(OrderItem orderItem){
51         orderItem.setOrder(this);//用关系维护端来维护关系
52         this.items.add(orderItem);
53     }
54
55 }  

订单项的实体类

 1 import javax.persistence.CascadeType;
 2 import javax.persistence.Column;
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.Id;
 6 import javax.persistence.JoinColumn;
 7 import javax.persistence.ManyToOne;
 8
 9 @Entity
10 public class OrderItem {
11     private Integer id;
12     private String productName;
13     private Float sellPrice = 0f;
14     private Order order;
15
16     @Id
17     @GeneratedValue
18     public Integer getId() {
19         return id;
20     }
21
22     public void setId(Integer id) {
23         this.id = id;
24     }
25
26     @Column(length = 40, nullable = false)
27     public String getProductName() {
28         return productName;
29     }
30
31     public void setProductName(String productName) {
32         this.productName = productName;
33     }
34
35     @Column(nullable = false)
36     public Float getSellPrice() {
37         return sellPrice;
38     }
39
40     public void setSellPrice(Float sellPrice) {
41         this.sellPrice = sellPrice;
42     }
43
44     @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true)
45     @JoinColumn(name="order_id")//这里设置JoinColum设置了外键的名字,并且orderItem是关系维护端
46     public Order getOrder() {
47         return order;
48     }
49
50     public void setOrder(Order order) {
51         this.order = order;
52     }
53
54 }  

下面看看测试类

 1 import javax.persistence.EntityManager;
 2 import javax.persistence.EntityManagerFactory;
 3 import javax.persistence.Persistence;
 4
 5 import org.junit.BeforeClass;
 6 import org.junit.Test;
 7
 8 import cn.itcast.bean.Order;
 9 import cn.itcast.bean.OrderItem;
10
11 public class OneToManyTest {
12
13     @BeforeClass
14     public static void setUpBeforeClass() throws Exception {
15     }
16     @Test public void addOrder(){
17          EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
18          EntityManager em = factory.createEntityManager();
19          em.getTransaction().begin(); // start transaction
20
21                    Order order = new Order();
22          order.setAmount(34f);
23          order.setOrderid("00001");
24
25                    //order中包含的OrderItem项OrderItem1,OrderItem2
26          OrderItem orderItem1 = new OrderItem();
27          orderItem1.setProductName("书");
28          orderItem1.setSellPrice(22f);
29          order.addOrderItem(orderItem1); //add orderitem in order
30
31          OrderItem orderItem2 = new OrderItem();
32          orderItem2.setProductName("篮球");
33          orderItem2.setSellPrice(100f);
34          order.addOrderItem(orderItem2);
35
36          em.persist(order); //persist order object
37          em.getTransaction().commit(); //commit transaction
38          em.close();
39          factory.close();
40     }
41 }  
时间: 2024-11-07 19:33:50

转@OneToMany或@ManyToOne的用法-annotation关系映射篇(上)的相关文章

Hibernate Annotation关系映射, 级联cascade属性

Hibernate Annotation关系映射, 级联cascade属性一. Hibernate Annotation关系映射 1.一对一外键关联映射(单向) 2.一对一外键关联映射(双向) 3.一对一主键关联映射(不重要)在这不演示 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成.Annotation注解一对

SSH-Hibernate(二)—关系映射(上)

关系映射的理解 上篇博客说过ORM是一种持久化的解决方案,它的思想呢就是将关系数据库中的表的记录映射到JAVA对象中.直白的说就是JAVA对象和关系数据库中的记录建立起了固定的对应关系,对象即记录!这样做的带来的最直接的表现就是,开发人员可以以面向对象的思想来操作关系型的数据库. 对象对应的是数据表中的记录,而在关系数据库中记录和记录之间存在着一对一.一对多.多对多等关系.ORM映射也需要保存这些记录之间的关系,它主要通过面向对象中关联关系来实现,继承关系是比较特殊的一种反应记录之间关系的形式.

持久化API(JPA)系列(六)实体关系映射(ORM)之映射类型

ORM实体关系映射,即将数据库中的数据表及表之间的关系,通过实体Bean及实体Bean之间的关系表现出来,实现通过操作实体Bean来操作数据库. ORM(Object-Relation-Map),其中Object表示实体Bean,Relation表示数据表,Map表示实体Bean与数据表的映射. 由于EJB3中的实体Bean采用JPA框架,因此这里的ORM就是指JPA映射.它的作用也类似于Hibernate.iBATIS.JDO.TopLink等持久化层框架中的实体关系映射. 根据表与表之间的关

hibernate注解之@Onetomany、@Manytoone、@JoinColumn

@Onetomany用于实体类与数据库表映射中少的一方,请看下面的例子. 假设一个用户只有一种角色,用户和角色是onetomany的关系 用户实体 @Entity @Table(name="user") public class UserEntity implements Serializable{ @Id @GenericGenerator(name="generator",strategy="uuid") @GeneratedValue(ge

JPA总结——实体关系映射(一对多@OneToMany)

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom

Hibernate One-to-Many Mappings 一对多关系映射

Hibernate One-to-Many Mappings 一对多关系映射 关键点:一对多关系使用 Set 实现, 例子:一个员工可以有多个学证书. Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml) 2.创建持久化类,即其实例需要保存到数据库中的类(Employee.java) 3.创建对象-关系映射文件(Employee.hbm.xml) 4.通过Hibernate API编写访问数据库的代码 创建Hibernate的配置文件(h

Spring Boot中@OneToMany与@ManyToOne几个需要注意的问题

@OneToMany如果不加@JoinColumn,系统会自动在主从表中增加一个中间表. 主表: @Entity(name = "Post") public class Post {       @Id     @GeneratedValue     private Long id;       private String title;       @OneToMany(         cascade = CascadeType.ALL,          orphanRemova

Hibernate之实体关系映射

延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才会执行SQL语句加载Email 注解配置时,@OnetToMany(Fetch = FetchType.EAGER)为即时加载,Fetch = FetchType.LAZY为延迟加载 延迟加载和即时加载的策略适用于所有一对多.多对一.多对多等所有的实体关系 一般来说,延迟加载要比即时加载节省资源,但

7.关系映射(待续)

这里指的是对象之间在数量上的关系,包括一对一.一对多.多对一.多对多四种. 单向与双向映射是编程角度的区别,在数据库角度讲,是没有区别的(即单向的数据库表与双向的数据库表是一模一样的) 双向关联必设mappedBy! 一对一单向外键关联@OneToOne @JoinColumn一对一双向外键关联@OneToOne(mappedBy="***") 一对一单向主键关联@OneToOne @PrimaryKeyJoinColumn  //很少用一对一双向外键关联@OneToOne(mappe