JPA(三)之实体关系一对多(多对一)


1.背景介绍:

   对于购买商品时,订单信息(Order)和订单商品信息(OrderItem)的关系就是一对多的关系。

 

2.实体bean:

  Order.java代码

 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package
com.sinoi.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="my_order")

public
class
Order {

    @Id
@Column(length=12)

    private
String orderId;

    @Column(nullable=false)

    private
Float amount = 0f;

    @OneToMany(cascade={CascadeType.REMOVE,
CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH},

            mappedBy="order")

    private
Set<OrderItem> orderItems =
new
HashSet<OrderItem>();

    public
String getOrderId() {

        return
orderId;

    }

    public
void
setOrderId(String orderId) {

        this.orderId
= orderId;

    }

    public
Float getAmount() {

        return
amount;

    }

    public
void
setAmount(Float amount) {

        this.amount
= amount;

    }

     

    public
Set<OrderItem> getOrderItems() {

        return
orderItems;

    }

    public
void
setOrderItems(Set<OrderItem> orderItems) {

        this.orderItems
= orderItems;

    }

    public
void
addOrderItem(OrderItem orderItem) {

        orderItem.setOrder(this);//这句代码不加也可!

        this.orderItems.add(orderItem);

    }

     

     

}

OrderItem.java代码

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

package
com.sinoi.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 {

    @Id
@GeneratedValue

    private
Integer id;

    @Column(length=20,
nullable=
false)

    private
String productName;

    @Column(nullable=false)

    private
Float sellPrice;

    @ManyToOne(cascade={CascadeType.REFRESH,
CascadeType.MERGE}, optional=
false)

    @JoinColumn(name="item_order_for")

    private
Order order;

    public
Order getOrder() {

        return
order;

    }

    public
void
setOrder(Order order) {

        this.order
= order;

    }

    public
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;

    }

    public
Float getSellPrice() {

        return
sellPrice;

    }

    public
void
setSellPrice(Float sellPrice) {

        this.sellPrice
= sellPrice;

    }

}

 

3.测试代码

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

package
junit.test;

 

import
javax.persistence.EntityManager;

import
javax.persistence.EntityManagerFactory;

import
javax.persistence.Persistence;

 

import
org.junit.Test;

 

import
com.sinoi.bean.Order;

import
com.sinoi.bean.OrderItem;

 

public
class
UnitTest {

    @Test

    public
void
save() {

        EntityManagerFactory entityManagerFactory
= Persistence

                .createEntityManagerFactory("unitname");

        EntityManager entityManager = entityManagerFactory

                .createEntityManager();

        entityManager.getTransaction().begin();

         

        Order order =
new
Order();

        order.setOrderId("jfdkf323");

        order.setAmount(232f);

        OrderItem orderItem =
new
OrderItem();

        orderItem.setProductName("basketball");

        orderItem.setSellPrice(221f);

        OrderItem orderItem2 =
new
OrderItem();

        orderItem2.setProductName("football");

        orderItem2.setSellPrice(11f);

        orderItem.setOrder(order);

        orderItem2.setOrder(order);

        order.addOrderItem(orderItem);

        order.addOrderItem(orderItem2);

 

        entityManager.persist(order);

        entityManager.getTransaction().commit();

        entityManager.close();

        entityManagerFactory.close();

         

    }

}

 

 

4.配置文件persistence.xml和前面JPA(一)、、、一样,在此省略

时间: 2024-10-11 13:09:32

JPA(三)之实体关系一对多(多对一)的相关文章

Hibernate之jpa实体映射的三种继承关系

在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略.   1.单表继承策略         单表继承策略,父类实体和子类实体共用一张数据库表,在表中通过一列辨别字段来区别不同类别的实体.具体做法如下: a.在父类实体的@Entity注解下添加如下的注解: @Inheritance(Strategy=InheritanceType.SINGLE_TABLE)@Dis

hibernate-Hibernate 三张表关联 一对多对多 配置

问题描述 Hibernate 三张表关联 一对多对多 配置 当更新classA时,关联多方(classB)能自动更新,单与classB 关联的多方(Class C)却不能自动更新 classC: classB: classA: classA对应的A表主键是B表的外键,ClassB对应的B表主键是C标的外键.现在情况是saveorupdate()A表的时候,B表能自动更新. classA 对应A表 classB :b表 classC: c表 A表的主键Aid 是b表的外键, b表的bid是c表的外

实体关系图

  解释 实体关系图:简记E-R图是指以实体.关系.属性三个基本概念概括数据的基本结构,从而描述静态数据结构的概念模式.E-R图为实体-联系图,提供了表示实体型.属性和联系的方法,用来描述现实世界的概念模型.E-R模型最常见的运用是在数据库设计的分析阶段,也就是数据库设计者和数据库用户之间的沟通工具和桥梁.E-R模型的作用是建构一个概念数据模型,而概念数据模型正是数据库结构的表示法,而且這种表示法与数据库管理系统及数据模型都无关系. 构成 实体(Entity): 它是关系型数据库的最基本抽像概念

Hibernate实体关系映射—Annotation

hibernate实体关系映射分为:     单边一对一,双边一对一:     单边一对多,单边多对一:     双边一对多,双边多对一:     单边多对多,双边多对多:     以及主键相同的单双边一对一.下面分别总结这几种关系映射的注解方法: 1.  单边一对一和双边一对一     单边一对一:比如一个学生(Student)有一个学生证(StudentCard),且Student类中有一个StudentCard对象: [java] view plain copy   @Entity    

困惑多年的问题:关于实体关系映射

问题描述 在实体映射时请问应该怎么处理实体之前的关系.举个例子,实体A引用实体B,实体B又与实体C为一对多(或多对多)关系,如下:classEntityA{publicintEntityBId{get;set;}publicEntityBEntityB{get;set;}}classEntityB{publicList<EntityC>EntityCItems{get;set;}}classEntityC{}数据访问类classEntityADAL{EntityAGetByPK(intEnti

Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many

通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?"血"的教训啊,刚开始使用 Entity Framework 的时候,由于没有静下心来认真理清关系,走了一些"痛不欲生"的弯路.而我们目前开发的项目都在使用 Entity Framework,为了避免其他人再经历"痛不欲生"的弯路.于是下定决心边"理清关系"边"写博客".

NBearV3——ORM实体关系设计速查手册

版本 1.2 [2006-11-13] 简介 本手册演示NBearV3支持的所有实体关系设计的完全参考.包括1对1,1对多,多对多关联以及自关联的正向.反向引用时的所有情况的设计方法. 注1:本手册并不讨论继承关系.因为,继承关系自然映射到设计实体接口的继承,无需太多额外讨论. 注2:所有的关联在演示中都包含了正向和反向的可读写引用,在实际的项目中,一般并不总是需要同时有正向和反向引用,可以只在一个方向包含引用,或一方包含引用,另一方只包含一个外键ID,也可以只包含只读的引用.并且,在双向引用时

【hibernate框架】一对多(多对一)双向CRUD-Cascade1

下面对一对多(多对一)的关联关系的CRUD进行测试. 这里用的是注解Annotation User.java: package cn.edu.hpu.one2many; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.T

hibernate的多对一,一对多,多对多,一对一怎么理解?

问题描述 hibernate的多对一,一对多,多对多,一对一怎么理解? 是多个字段对应一个字段,一个字段对应多个字段,多个字段对应多个字段?还是多个对象对应一个对象,一个对象对应多个对象,多个对象对应多个对象. 在一对一的表中为什么是有外键的要设计成many-to-one?无外键的设计成non-to-one? 解决方案 就是字面意思,一个key可以对应另一张表的多个字段,就好像身份对应城市一样