小弟最近学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
- 浏览 7896
- 评论(1)
- 论坛回复 / 浏览 (0 / 8015)
- 查看更多
相关推荐
jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联...
JPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAPJPA JAP
JPA课程manyToMany OneToMany 等全部测试 注解, 有注释
JPA映射关系,多种映射关系的图解,适合EJB初学者,对JPA映射关系的了解.
刚学完了hibernate和ejb,自己又自学了下jpa,看了黎活明老师的视频,自己做了个多对多的例子,希望可以对你学习有所帮助,有心人可以联系我QQ770256061!
jpa复杂查询,映射到具体的DTO上就比较复杂,需要类型完全匹配,还要求要建造构造函数,而且只能使用jpql查询,非常麻烦,querydsl也不方便,代码太长,后期维护的时候看上去也不直观。复杂sql还是采用原生sql比较...
基于springboot+jpa实现java后台api接口,点餐系统 基于springboot+jpa实现java后台api接口,点餐系统 基于springboot+jpa实现java后台api接口,点餐系统 基于springboot+jpa实现java后台api接口,点餐系统 基于...
springboot结合jpa实现分页,动态多条件查询,使用thymeleaf前端渲染数据
hibernate的中关系映射分为一对一、一对多、多对一、多对多,其中有单双向之分。而一对一还有主键和外键区分。一共是九种。分别用xml配置文件和annotation实现。annotation的版本没有写测试程序,见谅。
JPA学习笔记-EJB-04JPA关联映射总结 JPA JPA关联映射JPA学习笔记-EJB-04JPA关联映射总结 JPA JPA关联映射
为了方便广大开发朋友的需要特整理一下有关jpa映射关系,希望可以帮助到一些朋友。
趟坑 ManyToMany 循环引用 死循环 栈内存溢出问题
使用jpa映射关联和继承
单向一对一 双向一对一 单向一对多 双向一对多 双向多对一 单向多对多 双向多对多
本系统是基于Thymeleaf+SpringBoot+SpringDataJPA实现的的中小医院信息管理系统。简单实现了挂号收费,门诊管理,划价收费,药房取药,体检管理,药房管理,系统维护等基础功能。就诊卡提供了手动和读卡两种方式录入...
05_JPA详解_日期_枚举等字段类型的JPA映射.zip 05_JPA详解_日期_枚举等字段类型的JPA映射.zip
毕设项目-基于springboot+jpa实现java后台api接口点餐系统源码.zip毕设项目-基于springboot+jpa实现java后台api接口点餐系统源码.zip毕设项目-基于springboot+jpa实现java后台api接口点餐系统源码.zip毕设项目-基于...
SpringBoot整合JPA实现自动创建数据库表自动建表,JPA逆向生成数据库表 运行环境 jdk8+tomcat9+mysql+IntelliJ IDEA+maven 项目技术(必填) springboot+jpa 数据库文件(可选) 新建一个test的数据库即可,表在...
05_传智播客JPA详解_日期_枚举等字段类型的JPA映射
JPA视频_映射单向多对一的关联关系 · 13. JPA视频_映射单向一对多的关联关系 · 14. JPA视频_映射双向一对多的关联关系 · 15. JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 ...