关于hibernate中多个OneToMany情况如何设计映射关系

问题描述

标题说的不够清楚,具体是这样的:有一个附件表,一个用户表,一个课程表,一个实验表。一个附件属于某个用户的某个课程的某个实验,但是一个用户可以有多个附件,一个课程也可以有多个附件,一个实验也能有多个附件。所以就成了:public class Attachment {@ManyToOne //用户public User user;@ManyToOne //课程public Course course; //实验@ManyToOnepublic Task task;}感觉这样设计初始化时需要同时获得user,course和task。 比较麻烦,这样设计是不是有问题? 更合理的设计是怎样的? 请指教。 问题补充:谢谢各位回答 分不多给最先回答的那位了 还是多些各位。

解决方案

我觉得这样设计没有什么问题
解决方案二:
一个附件属于某个用户的某个课程的某个实验。我理解的意思是“一个用户可以有多个课程,一个课程也可以有多个实验,一个实验也能有多个附件”,实验和附件应该是聚合或组合关系类关系图如下User(1) - (*)Course(1) - (*)Task(1) - (*)AttachmentAttachment应该如下: public class Attachment { //实验 @ManyToOne public Task task; } @ManyToOne //用户 public User user; @ManyToOne //课程 public Course course; 这两个是冗余属性,如果是经常要用到又有性能问题,可以冗余过来(从本例来看,这两个冗余属性应该是不会变化的,如果变化还要考虑数据同步问题)。另外,还可以考虑延迟加载嘛
解决方案三:
如果 “一个用户表,一个课程表,一个实验表 ”它们三个的附件没有关系的话,你可以把附件表拆成三个。 这样有助于查询速度。。
解决方案四:
多对一,这样设计不感觉有问题。

时间: 2024-11-24 21:25:39

关于hibernate中多个OneToMany情况如何设计映射关系的相关文章

关于JPA中多个OneToMany情况如何设计映射关系

问题描述 有一个附件表,有一个文章表,有一个图书表文章表和图书表没有任何关系文章表下可以有多个附件图书表下可以有多个附件而且同时映射到一个栏位,id值uuid不会重复这样的关系如何映射Article.java@OneToMany@JoinColumn(name = "refId", referencedColumnName = "id")private List<Attachment> attachmentList;Book.java@OneToMany

Hibernate中@ManyToOne与@OneToMany注解查询结果用gson序列化出现循环引用问题

问题描述 首先,我确定我遇到的问题在baidu没有找到解决方案.现有2个表Customer,Account两个表,他们之间是一对多的关系,一个客户有多个账户.定义2个实体类如下:publicclassCustomerimplementsSerializable{privateStringcustId;.......privateSet<Account>accounts=newHashSet<Account>(0);@OneToMany(cascade==CascadeType.AL

hibernate中映射多对多的问题

问题描述 在hibernate中,如果要映射多对多的映射比如有两个实体:user, privilege,数据库中通过link表来表示两者的关联关系,单在link中有一个flag标识是否有效,这样怎样在hibernate中解决?拆成两个一对多?还有没有其他方法?问题补充:我的意思是link中除了那三个字段之外,我还有一个字段表示这个关系是否生效,也就是说,这个字段是重点,在业务中要靠这个字段来确定映射关系是否有效.谢谢问题补充:formular我试过可是如果我的需求是动态的,怎么办?其实这才是我的

onetomany-Hibernate中@ManyToOne与@OneToMany注解查询结果用gson序列化出现循环引用问题

问题描述 Hibernate中@ManyToOne与@OneToMany注解查询结果用gson序列化出现循环引用问题 首先,我确定我遇到的问题在baidu没有找到解决方案. 现有2个表Customer,Account两个表,他们之间是一对多的关系 , 一个客户有多个账户.定义2个实体类如下: public class Customer implements Serializable{ private String custId; ....... private Set<Account> acc

hibernate中java.util.Date类型映射

在Hibernate中对于java.util.Date类型的映射为: java类型 Hibernate类型 Mysql类型 java.util.Date.java.sql.Date date DATE java.util.Date.java.sql.Time time TIME java.util.Date.java.sql.Timestamp timestamp TIMESTAMP 如果使用timestamp作为Date类型映射时,具体代码如下: Java代码 public class Use

在Hibernate中正确实现关联关系中的级联操作(cascading)

关系数据库系统本身就比较复杂,加上Hibernate的O/R映射层,复杂度加重了,很容易出现问题,本人将最近遇到的问题和解决方法做一个总结,整理在下面的一系列文章中 正确理解Hibernate的聚合类型(collection)的使用 在Hibernate中正确实现关联关系中的级联操作(cascading) 在Hibernate框架中编写持久对象类实现外键关联的几点注意事项 本文是第二篇,讲解在one-to-many(一对多)和many-to-one(多对一)关联关系中的cascade特性的声明方

Hibernate中通过关联映射取得结果集对结果进行排序、分页的方法

问题描述 在Hibernate中通过关联映射, 例如OneToMany等取得一个实体的属性结果集时有没有办法对结果进行排序或者分页. 直接通过HQL或者SQL可以直接利用HQLSQL进行排序分页等操作, 但是如果这类关联映射不支持这些操作那么关联映射的作用感觉也不是很大了. 例如一个User实体有一个Set<Logs>属性, 即一个用户有N多操作日志,OneToMany的, 那么如果通过User.getLogs()取得的结果集将是全部查询··· 解决方案 作为属性,分页应该不行.排序可以: @

Hibernate中新的TableGenerator 机制

从 initialValue 说起 问题的发现源自对 JPA 中 TableGenerator 的测试.测试的环境有这样几个条件: 为方便查询的测试,Employee 表格在初始化时会导入部分记录,这部分记录的主键在初始脚本中手动写好,比如 1.2.3.4.(参看文章所附示例代码中的import_data.sql 文件). Employee 实体使用 TableGenerator 主键生成器,initialValue 的值设置为 10. 在单元测试中添加新的 Employee 记录. Emplo

Hibernate中load和get的区别

Hibernate中Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象.其区别在于: 1.get()方法直接返回实体类,load()方法可以返回实体的代理类实例. 2.hibernate load是采用延迟机制(当lazy属性为true时) 而get不采用延迟机制(get语句马上读库) 3.找不到符合条件的数据 get方法将返回null load将会报出ObjectNotFoundExcepion 4.get支持多态查询,load只有在la