重构hibernate多对多的问题

问题描述

举一个简单的例子,有两个类Person和Language,一个Person可以讲多种语言,一种语言也可以有多个User,因此很完美地用“多对多”来关联这两个类。现在需要多一个属性,比如是level用来评价某个person对某种语言的掌握程度,我的问题是,该如何重构,对原来的代码影响最小。(如果增加一个实体类来组合Person/language/level),这个影响太大了。是不是 <composite-element>是最有效的方法了?

解决方案

这个问题从昨天想到今天,感觉还是没有一个零自己满意的答案。通常关联表就两个字段,比如楼主举例的Person表和Language表,那么有个关联表Person_Language表。在作Hibernate映射的时候,Person表和Language表都有对应的实体,而关联表Person_Language是没有对应的实体的。关联表完全是一种中间桥梁的作用,一般是通过Person表和Language的映射文件的<set>元素来表现的。一旦关联表增加了属性,比如level,那么我觉得关联表Person_Language不再是纯粹的关联表了。昨天我是死盯着配置文件的<set>和原有的表结构关系,所以,搞的很痛苦。今天有翻看吓昕的《深入浅出Hibernate》,感觉似乎有点想法了。我看完4.4 章节,感觉Person_Language不再是关联表了,他应该是个独立的实体,他应该换个表名。想想,楼主只是加了一个字段,如果过加几个字段,实体的感觉就更强烈些。(当然跟属性多少没有关系),而level加在Person或者Language中都是不合适的,根本行不通。当把Person_Language当做一个实体后,在model中为其生成一个pojo对象。调整映射关系,Person和Person_Language是一对多关系,Language和Person_Language也是一对多关系。
解决方案二:
楼主增加一个实体是不是下面这中形式:t_user(id, name, sex)t_role(id, desc)t_pri(id, type)t_user_role_pri(userid,roleid,priid)有了满意的答案望告之,多谢!

时间: 2024-08-02 03:41:21

重构hibernate多对多的问题的相关文章

hibernate-eclipse如何利用数据库反向生成Hibernate多对多、一对多实体类(生成全部为int类型)。

问题描述 eclipse如何利用数据库反向生成Hibernate多对多.一对多实体类(生成全部为int类型). 如题 解决方案 如果你表的关系建好了,,直接通过dataSource就能反向生成了 解决方案二: Myeclipse 连接到你的数据库,在对应的表上右击,点hibernate reserve ,然后一步步操作下去,就会成功 解决方案三: /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.6.26-log : Database - db_template

Hibernate多对多关系查询出所有结果

问题描述 Hibernate多对多关系查询出所有结果 问题背景: 现在有三张表,学生.班级.课程,学生和班级为多对多,学生和课程为多对多,班级和课程是多对一,即一门课可以有多个班级. 我写的学生实体类: private Integer id; private String name; private Set<Clazz> clazzs=new HashSet<>(); //n-n private Set<Course> courses=new HashSet<&g

hibernate多对多关联查询配置

问题描述 hibernate多对多关联查询配置 学生.课程.成绩三者 public class Student extends BaseModel { private static final long serialVersionUID = 1L; @Id @GenericGenerator(name = "idGenerator", strategy = "uuid") @GeneratedValue(generator = "idGenerator&q

hibernate 多对多 中间表主键问题?

问题描述 现在有一个问题就是在hibernate多对多中间表,一般都是两个外键,例如:用户表主键:userid角色表主键:roleid中间表字段为两个外键:userid,roleid作为联合主键.但是现在我如果想在中间表加一个字段为单独的主键,即设置一个字段id作为主键.那么采用hibernate向中间表插入数据的时候,就会出现问题,即设置一个字段id作为主键.那么采用hibernate向中间表插入数据的时候,就会出现问题,即主键id字段插入为空,会报错误Causedby:java.sql.SQ

java web-怎样更新hibernate多对一中的一方

问题描述 怎样更新hibernate多对一中的一方 还是那个问题下午把查看多对一中的一方(所属类别)问题解决了但是更新不了(所属类别)?是因为我直接把对象set进去了还是别的问题?medicine是多方在其实体类中有属性private Category category:,category是一方 medicine.hbm.xml: category.hbm.xml: action类: public class MedicineUpdateAction extends ActionSupport

Hibernate 多对多关联 中间表有多个字段如何配置

问题描述 例如 :学生 与课程之间是多对多关联,中间表不仅有学生表和课程表的主键,中间表还有其他字段(成绩等),该如何配置,用JPA如何设置,望大家指点指点| 解决方案 一个事例:LoginInfo.hbm.xml<hibernate-mapping><class name="com.ucit.ca.webApp.po.LoginInfo" table="CAS_USER_MODULE_INFO"><id name="lid&

hibernate 多对多为空进行查询

问题描述 hibernate 多对多为空进行查询 各位好: @Entity @Table(name = "ROLES") public class Role implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @ManyToMany(mappedBy = "roleSet", fetch = FetchType.EAGER, cascade = CascadeTy

hibernate 多对一得跑起来很慢,大家如何解决?

问题描述 hibernate多对一得跑起来很慢,大家如何解决? 解决方案 解决方案二:看你是不是需要及时获得信息.如果要的话fetch='join'看你用不用延迟加载了!!如果用lazy='true',那配fetch='join'作用也不大,就要用select其次就怕关联了spring,这个有优化sql功能.慢慢研究.解决方案三:我比较好奇,楼主是怎么感觉到他慢的?解决方案四:详细点楼主没说清楚尽量懒加载解决方案五:延迟加载,还有就是别用关系

hibernate 多对多删除 中间表记录还在

问题描述 请问一下hibernate 多对多删除一方的记录的时候,为什么中间表的记录没有跟着删除呢,但是我在存入的时候,中间表记录就自动生成了啊 问题补充:UserGroup表private Set<Paper> papers = new HashSet<Paper>();@ManyToMany@JoinTable(name="tm_paper_usergroup",joinColumns={@JoinColumn(name="usergroupid&