小弟最近学EJB3.0,写个小网站来练练手,中间也碰到一些问题。把解决过程写下来主要是怕自己忘了,如果能给大伙帮点忙,也算没白敲这些字了。
需求很简单:商品分类实体,一个商品分类既可以拥有多个子分类,比如水果分类下可以有苹果,香蕉等等。
也可以属于多个分类。比如剃须刀既可以属于小电器,也可以属于男士用品。
这就要用到JPA的@ManyToMany注释了。先创建分类表
java 代码
- create table category (
- cid integer identity,
- cname varchar(100) null,
- constraint PK_CATEGORY primary key (cid)
- )
此外,使用ManyToMany映射还需要一张中间表来保存分类之间的关系从属关系
java 代码
- create table ctg_relation (
- upcid integer null,
- cid integer null
- )
废话少说,贴代码:
java 代码
- @Entity
- public class Category {
- private int cid;
- private String cname;
- private List<Category> subCategories = new ArrayList();
- private List<Category> UpCategories = new ArrayList();
- @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)
- @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "upcid"), inverseJoinColumns = @JoinColumn(name = "cid"))
- public List<Category> getSubCategories() {
- return subCategories;
- }
-
- public void setSubCategories(List<Category> subCategories) {
- this.subCategories = subCategories;
- }
-
-
- @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)
- @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "cid"), inverseJoinColumns = @JoinColumn(name = "upcid"))
- public List<Category> getUpCategories() {
- return UpCategories;
- }
- public void setUpCategories(List<Category> upCategories) {
- UpCategories = upCategories;
- }
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- public int getCid() {
- return cid;
- }
-
- public void setCid(int cid) {
- this.cid = cid;
- }
-
- public String getCname() {
- return cname;
- }
-
- public void setCname(String cname) {
- this.cname = cname;
- }
-
- }
说明:
java 代码
- @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)
- @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "upcid"), inverseJoinColumns = @JoinColumn(name = "cid"))
- public List getSubCategories() {
- return subCategories;
- }
这个是对子类的映射,cascade设为PERSIST表示保存分类时,把所有的子类也一起保存。
@JoinTable注释指明了关联表是ctg_relation ,拥有方为upid(即父分类),被动方(inverseJoinColumns)是cid(即子分类)。
关于拥有方和被动方的概念我也没太搞清楚。我认为是两个实体关联时的“对方”作为被动方。大家请看下面那个ManyToMany注释
java 代码
- @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)
- @JoinTable(name = "ctg_relation", joinColumns = @JoinColumn(name = "cid"), inverseJoinColumns = @JoinColumn(name = "upcid"))
-
- public List getUpCategories() {
- return UpCategories;
- }
这是对本分类的上级分类的映射,此时就要把joinColumns改为cid(子分类),inverseJoinColumns改为upcid(父分类)。
写个测试类测试一下:
java 代码
- public class TestEntity implements TestEntityLocal, TestEntityRemote {
- @PersistenceContext
- private EntityManager em;
-
- public void testCategory() {
- Category food = new Category();
- food.setCname("food");
- Category fruit = new Category();
- fruit.setCname("fruit");
- Category bananer = new Category();
- bananer.setCname("bananer");
- fruit.getUpCategories().add(food);
- bananer.getUpCategories().add(fruit);
- bananer.getUpCategories().add(food);
- em.persist(bananer);
- }
-
- }
结果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就没搞明白,请大家一起讨论讨论
分享到:
- 2007-12-27 22:08
- 浏览 7937
- 评论(1)
- 论坛回复 / 浏览 (0 / 8047)
- 查看更多
相关推荐
### JPA映射关系详解 Java Persistence API (JPA) 是一种用于管理关系型数据库中的数据的标准 Java 技术。JPA 提供了一种对象关系映射 (ORM) 方法来处理数据库,允许开发者以面向对象的方式操作数据库。本文将详细...
在本课程中,我们将深入探讨JPA中的一些关键关系映射类型,包括`@ManyToMany`、`@OneToMany`等,以及它们的实际应用和测试。 ### `@ManyToMany`关系 在数据库设计中,`ManyToMany`关系表示两个实体之间存在多对多...
JPA通过使用注解(Annotation)来实现对象与数据库表之间的映射。这些注解是元数据的一种形式,嵌入在Java源代码中,提供了关于类、字段和方法的信息,使得JPA能够理解并执行相应的数据库操作。 1. **实体(Entity...
在Java Persistence API (JPA) 中,实体映射关系是数据库关系模型与Java对象模型之间的桥梁,用于在ORM(对象关系映射)框架下管理数据。JPA 提供了多种映射关系,使得开发者能够方便地处理不同类型的关联。下面我们...
在这个“Spring MVC全注解实战开发大型商业ERP项目”的第二部分,我们将深入探讨如何使用JPA来处理多表映射,这是数据库设计中的一个关键概念,特别是在关系型数据库中。 首先,JPA是Java EE平台的一部分,它提供了...
在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA中,关联映射可以通过注解直接在实体类上完成,实现了所谓的“零配置”。 在给定的需求场景中,设计了一个简单的用户权限管理系统,其中包含三个核心...
在Java世界中,Java Persistence API(JPA)是用于对象关系映射(ORM)的一种标准框架,它允许开发者将数据库操作与业务逻辑紧密结合,而无需编写大量的SQL代码。本篇文章将深入探讨如何在JPA中映射关联和实现继承。...
在Spring Boot 1.5.2版本中,Java Persistence API (JPA) 是一个非常流行的ORM框架,用于处理关系数据库的映射。本教程将深入探讨如何在Spring Boot项目中设置和使用ManyToMany关联,以及如何解决在此过程中可能出现...
JPA提供了多种关系映射方式,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些关系可以通过`@JoinColumn`和`@JoinTable`注解进行配置。 ### 7. 查询语言 JPA提供...
JPA支持一对一、一对多、多对一和多对多的关系映射,通过`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解实现。关联关系可以是懒加载或即时加载,通过`fetch`属性配置。 6. **查询语言JPQL**: JPA...
以上内容涵盖了JPA实现数据库操作的基础知识,随着项目的深入,你可能需要学习更多关于Spring与JPA集成的内容,包括Spring Boot、Spring Data JPA、事务管理、分页查询、自定义查询方法等,这些都是构建高效、可维护...
JPA通过注解来实现对象/关系映射。以下是一些常见的注解: - **@Entity**:标记一个类为JPA实体类,表示这个类将被映射到数据库中的表。 - **@Table**:定义实体对应的数据库表名,如`@Table(name = "users")`。 ...
- **关系映射**:如果子类中存在与其它实体的关系,需要使用`@ManyToOne`、`@OneToOne`、`@OneToMany`或`@ManyToMany`等注解进行映射。 - **查询**:在使用继承关系时,JPA的`Criteria API`或`JPQL`查询可能需要特殊...
本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...
在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的规范,它为开发者提供了ORM(对象关系映射)能力,使得在Java应用中操作数据库变得更加简单。本篇我们将深入探讨JPA中的多对多双向关联,即`@...
关系映射是指实体间关系的映射,JPA提供了四种基本关系映射类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。每种关系类型都具有方向性和基数。一对一映射指实体直接...
在Java Persistence API (JPA) 中,映射关联关系是数据模型设计的重要组成部分。JPA 提供了多种方式来处理不同类型的关联关系,包括单向多对一、单向一对多、双向一对一、双向多对一和双向多对多。下面我们将详细...
- **关系映射**:`@ManyToOne`,`@OneToMany`,`@OneToOne`,`@ManyToMany`注解用于处理实体间的关系。 - **复合主键**:`@EmbeddedId`和`@IdClass`用于处理复杂的主键结构。 - **继承映射**:支持单表继承...
在这个“JPA常用关系实现例子”中,我们将探讨四种主要的关系类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系定义了实体间的关联,有助于在数据库设计中创建...
TOPLink JPA是Oracle公司提供的一个JPA实现,它是TOPLink ORM工具的一部分。TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的...