`
jamjar
  • 浏览: 14294 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

JPA实现自身的ManyTOMany映射

阅读更多

小弟最近学EJB3.0,写个小网站来练练手,中间也碰到一些问题。把解决过程写下来主要是怕自己忘了,如果能给大伙帮点忙,也算没白敲这些字了。

需求很简单:商品分类实体,一个商品分类既可以拥有多个子分类,比如水果分类下可以有苹果,香蕉等等。

也可以属于多个分类。比如剃须刀既可以属于小电器,也可以属于男士用品。

这就要用到JPA的@ManyToMany注释了。先创建分类表

java 代码
  1. create table category (   
  2.    cid                  integer              identity,   
  3.    cname                varchar(100)         null,   
  4.    constraint PK_CATEGORY primary key (cid)   
  5. )  

此外,使用ManyToMany映射还需要一张中间表来保存分类之间的关系从属关系

java 代码
  1. create table ctg_relation (   
  2.    upcid                integer              null,/*父类id*/  
  3.    cid                  integer              null/*子类Id*/  
  4. )  

废话少说,贴代码:

java 代码
  1. @Entity  
  2. public class Category {   
  3.     private int cid;   
  4.     private String cname;   
  5.     private List<Category> subCategories = new ArrayList();   
  6.     private List<Category> UpCategories = new ArrayList();   
  7.     @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)   
  8.     @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "upcid"), inverseJoinColumns = @JoinColumn(name = "cid"))   
  9.     public List<Category> getSubCategories() {   
  10.         return subCategories;   
  11.     }   
  12.   
  13.     public void setSubCategories(List<Category> subCategories) {   
  14.         this.subCategories = subCategories;   
  15.     }   
  16.   
  17.        
  18.     @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)   
  19.     @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "cid"), inverseJoinColumns = @JoinColumn(name = "upcid"))   
  20.     public List<Category> getUpCategories() {   
  21.         return UpCategories;   
  22.     }   
  23.     public void setUpCategories(List<Category> upCategories) {   
  24.         UpCategories = upCategories;   
  25.     }   
  26.   
  27.     @Id  
  28.     @GeneratedValue(strategy = GenerationType.AUTO)   
  29.     public int getCid() {   
  30.         return cid;   
  31.     }   
  32.   
  33.     public void setCid(int cid) {   
  34.         this.cid = cid;   
  35.     }   
  36.   
  37.     public String getCname() {   
  38.         return cname;   
  39.     }   
  40.   
  41.     public void setCname(String cname) {   
  42.         this.cname = cname;   
  43.     }   
  44.   
  45. }  

说明:

java 代码
  1. @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)   
  2. @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "upcid"), inverseJoinColumns = @JoinColumn(name = "cid"))   
  3. public List getSubCategories() {   
  4.  return subCategories;   
  5. }  

这个是对子类的映射,cascade设为PERSIST表示保存分类时,把所有的子类也一起保存。

@JoinTable注释指明了关联表是ctg_relation ,拥有方为upid(即父分类),被动方(inverseJoinColumns)是cid(即子分类)。

关于拥有方和被动方的概念我也没太搞清楚。我认为是两个实体关联时的“对方”作为被动方。大家请看下面那个ManyToMany注释

java 代码
  1. @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)   
  2. @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "cid"), inverseJoinColumns = @JoinColumn(name = "upcid"))   
  3.   
  4. public List getUpCategories() {   
  5.  return UpCategories;   
  6. }   

这是对本分类的上级分类的映射,此时就要把joinColumns改为cid(子分类),inverseJoinColumns改为upcid(父分类)。

写个测试类测试一下:

java 代码
  1. public class TestEntity implements TestEntityLocal, TestEntityRemote {   
  2.  @PersistenceContext  
  3.  private EntityManager em;   
  4.   
  5.  public void testCategory() {   
  6.   Category food = new Category();   
  7.   food.setCname("food");   
  8.   Category fruit = new Category();   
  9.   fruit.setCname("fruit");   
  10.   Category bananer = new Category();   
  11.   bananer.setCname("bananer");   
  12.   fruit.getUpCategories().add(food);   
  13.   bananer.getUpCategories().add(fruit);   
  14.   bananer.getUpCategories().add(food);   
  15.   em.persist(bananer);   
  16.  }   
  17.   
  18. }   

 结果Hibernate写了如下语句:

22:06:17,703 INFO  [STDOUT] Hibernate: insert into Category (cseq, cname) values (?, ?)
22:06:17,703 INFO  [STDOUT] Hibernate: insert into Category (cseq, cname) values (?, ?)
22:06:17,703 INFO  [STDOUT] Hibernate: insert into Category (cseq, cname) values (?, ?)
22:06:17,718 INFO  [STDOUT] Hibernate: insert into ctg_relation (cid, upcid) values (?, ?)
22:06:17,718 INFO  [STDOUT] Hibernate: insert into ctg_relation (cid, upcid) values (?, ?)
22:06:17,718 INFO  [STDOUT] Hibernate: insert into ctg_relation (cid, upcid) values (?, ?)

前三个分别是插入food,fruit,banner

后三个往关系表中插入他们之间的关系

小弟初学乍练,不足之处请大家指点。比如这个inverseJoinColumns就没搞明白,请大家一起讨论讨论

 

 

分享到:
评论
1 楼 Vonztony 2008-03-29  
楼主辛苦了

相关推荐

    JPA映射关系详解javax JPA JPA映射关系 JPA映射

    ### JPA映射关系详解 Java Persistence API (JPA) 是一种用于管理关系型数据库中的数据的标准 Java 技术。JPA 提供了一种对象关系映射 (ORM) 方法来处理数据库,允许开发者以面向对象的方式操作数据库。本文将详细...

    JPA课程manyToMany OneToMany 等全部测试

    在本课程中,我们将深入探讨JPA中的一些关键关系映射类型,包括`@ManyToMany`、`@OneToMany`等,以及它们的实际应用和测试。 ### `@ManyToMany`关系 在数据库设计中,`ManyToMany`关系表示两个实体之间存在多对多...

    JPA视频教程_使用jpa映射单个实体对象

    JPA通过使用注解(Annotation)来实现对象与数据库表之间的映射。这些注解是元数据的一种形式,嵌入在Java源代码中,提供了关于类、字段和方法的信息,使得JPA能够理解并执行相应的数据库操作。 1. **实体(Entity...

    jpa的实体映射关系7种

    在Java Persistence API (JPA) 中,实体映射关系是数据库关系模型与Java对象模型之间的桥梁,用于在ORM(对象关系映射)框架下管理数据。JPA 提供了多种映射关系,使得开发者能够方便地处理不同类型的关联。下面我们...

    第二部分、JPA操作多表映射.rar

    在这个“Spring MVC全注解实战开发大型商业ERP项目”的第二部分,我们将深入探讨如何使用JPA来处理多表映射,这是数据库设计中的一个关键概念,特别是在关系型数据库中。 首先,JPA是Java EE平台的一部分,它提供了...

    JPA学习笔记-EJB-04JPA关联映射总结

    在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA中,关联映射可以通过注解直接在实体类上完成,实现了所谓的“零配置”。 在给定的需求场景中,设计了一个简单的用户权限管理系统,其中包含三个核心...

    使用jpa映射关联和继承

    在Java世界中,Java Persistence API(JPA)是用于对象关系映射(ORM)的一种标准框架,它允许开发者将数据库操作与业务逻辑紧密结合,而无需编写大量的SQL代码。本篇文章将深入探讨如何在JPA中映射关联和实现继承。...

    springboot 1.5.2 jpa ManyToMany Demo

    在Spring Boot 1.5.2版本中,Java Persistence API (JPA) 是一个非常流行的ORM框架,用于处理关系数据库的映射。本教程将深入探讨如何在Spring Boot项目中设置和使用ManyToMany关联,以及如何解决在此过程中可能出现...

    05_JPA详解_日期_枚举等字段类型的JPA映射.zip

    JPA提供了多种关系映射方式,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些关系可以通过`@JoinColumn`和`@JoinTable`注解进行配置。 ### 7. 查询语言 JPA提供...

    05_传智播客JPA详解_日期_枚举等字段类型的JPA映射

    JPA支持一对一、一对多、多对一和多对多的关系映射,通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解实现。关联关系可以是懒加载或即时加载,通过`fetch`属性配置。 6. **查询语言JPQL**: JPA...

    jpa实现数据库操作

    以上内容涵盖了JPA实现数据库操作的基础知识,随着项目的深入,你可能需要学习更多关于Spring与JPA集成的内容,包括Spring Boot、Spring Data JPA、事务管理、分页查询、自定义查询方法等,这些都是构建高效、可维护...

    JPA环境搭建及基础映射

    JPA通过注解来实现对象/关系映射。以下是一些常见的注解: - **@Entity**:标记一个类为JPA实体类,表示这个类将被映射到数据库中的表。 - **@Table**:定义实体对应的数据库表名,如`@Table(name = "users")`。 ...

    JPA 实现继承关系

    - **关系映射**:如果子类中存在与其它实体的关系,需要使用`@ManyToOne`、`@OneToOne`、`@OneToMany`或`@ManyToMany`等注解进行映射。 - **查询**:在使用继承关系时,JPA的`Criteria API`或`JPQL`查询可能需要特殊...

    JPA一对一,一对多,多对多关系映射

    本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...

    JPA学习总结(四)--JPAManyToMany双向关联

    在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的规范,它为开发者提供了ORM(对象关系映射)能力,使得在Java应用中操作数据库变得更加简单。本篇我们将深入探讨JPA中的多对多双向关联,即`@...

    JPA2映射的神秘之旅

    关系映射是指实体间关系的映射,JPA提供了四种基本关系映射类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。每种关系类型都具有方向性和基数。一对一映射指实体直接...

    JPA-4 映射关联关系

    在Java Persistence API (JPA) 中,映射关联关系是数据模型设计的重要组成部分。JPA 提供了多种方式来处理不同类型的关联关系,包括单向多对一、单向一对多、双向一对一、双向多对一和双向多对多。下面我们将详细...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    - **关系映射**:`@ManyToOne`,`@OneToMany`,`@OneToOne`,`@ManyToMany`注解用于处理实体间的关系。 - **复合主键**:`@EmbeddedId`和`@IdClass`用于处理复杂的主键结构。 - **继承映射**:支持单表继承...

    JPA常用关系实现例子

    在这个“JPA常用关系实现例子”中,我们将探讨四种主要的关系类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系定义了实体间的关联,有助于在数据库设计中创建...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    TOPLink JPA是Oracle公司提供的一个JPA实现,它是TOPLink ORM工具的一部分。TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的...

Global site tag (gtag.js) - Google Analytics