我想坚持一个拥有一些资源(内联或附件)的邮件实体.首先,我将它们视为双向关系:

@Entity

public class Mail extends BaseEntity {

@OneToMany(mappedBy = "mail", cascade = CascadeType.ALL, orphanRemoval = true)

private List resource;

private String receiver;

private String subject;

private String body;

@Temporal(TemporalType.TIMESTAMP)

private Date queued;

@Temporal(TemporalType.TIMESTAMP)

private Date sent;

public Mail(String receiver, String subject, String body) {

this.receiver = receiver;

this.subject = subject;

this.body = body;

this.queued = new Date();

this.resource = new ArrayList<>();

}

public void addResource(String name, MailResourceType type, byte[] content) {

resource.add(new MailResource(this, name, type, content));

}

}

@Entity

public class MailResource extends BaseEntity {

@ManyToOne(optional = false)

private Mail mail;

private String name;

private MailResourceType type;

private byte[] content;

}

当我救了他们:

Mail mail = new Mail("asdasd@asd.com", "Hi!", "...");

mail.addResource("image", MailResourceType.INLINE, someBytes);

mail.addResource("documentation.pdf", MailResourceType.ATTACHMENT, someOtherBytes);

mailRepository.save(mail);

执行了三个插入:

INSERT INTO MAIL (ID, BODY, QUEUED, RECEIVER, SENT, SUBJECT) VALUES (?, ?, ?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE, MAIL_ID) VALUES (?, ?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE, MAIL_ID) VALUES (?, ?, ?, ?, ?)

然后我认为仅使用OneToMany关系会更好.无需在每个MailResource中保存哪个Mail:

@Entity

public class Mail extends BaseEntity {

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

@JoinColumn(name = "mail_id")

private List resource;

...

public void addResource(String name, MailResourceType type, byte[] content) {

resource.add(new MailResource(name, type, content));

}

}

@Entity

public class MailResource extends BaseEntity {

private String name;

private MailResourceType type;

private byte[] content;

}

生成的表完全相同(MailResource有一个FK到Mail).问题是执行的SQL:

INSERT INTO MAIL (ID, BODY, QUEUED, RECEIVER, SENT, SUBJECT) VALUES (?, ?, ?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE) VALUES (?, ?, ?, ?)

INSERT INTO MAILRESOURCE (ID, CONTENT, NAME, TYPE) VALUES (?, ?, ?, ?)

UPDATE MAILRESOURCE SET mail_id = ? WHERE (ID = ?)

UPDATE MAILRESOURCE SET mail_id = ? WHERE (ID = ?)

为什么这两个更新?我正在使用EclipseLink,使用另一个JPA提供程序作为Hibernate,这种行为是否相同?哪种解决方案更好?

更新:

? – 如果我不使用@JoinColumn,EclipseLink会创建三个表:MAIL,MAILRESOURCE和MAIL_MAILRESOURCE.我认为这是完全逻辑的.但是对于@JoinColumn,它只有足够的信息来创建两个表,在我看来,只进行插入,没有更新.

单向关联java_java – 使用单向或双向关系的不同行为相关推荐

  1. 反转单向链表java_Java实现单向链表反转

    本文实例为大家分享了Java实现单向链表反转的具体代码,供大家参考,具体内容如下 1.实现代码 public class LinkedListTest { public static void mai ...

  2. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联...

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  3. Hibernate一对多单向关联和双向关联映射方法及其优缺点

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同. 它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的 ...

  4. hibernate一对一外键单向关联

    与上篇相对应,还是client和address是一对一的外键关联关系,address表中的主键ID与client表中的外键CLIENTADDRESSID构成一对一外键关联关系. 表结构和sql语句就不 ...

  5. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  6. [置顶] Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  7. Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  8. java之hibernate之基于外键的一对一单向关联映射

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

  9. Hibernate检索策略之5.4一对多单向关联检索策略——Hibernate4究竟怎么玩

    今天开始讲一对多单向关联. 转载于:https://www.cnblogs.com/geyifan/archive/2012/09/13/2682669.html

  10. Hibernate 一对一外键单向关联

    [align=center][size=medium]Hibernate 一对一外键单向关联[/size][/align] 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向 ...

最新文章

  1. js 抛出异常 throw
  2. nginx rewrite和根据url参数location
  3. COGS 930. [河南省队2012] 找第k小的数 主席树
  4. 利用DHT22和Arduino测量温湿度并显示在串口和OLED显示屏上
  5. 红橙Darren视频笔记 Behavior的工作原理源码分析
  6. 面试题 01.09. 字符串轮转
  7. 商业认知,新的一年已经开始,许多老板都制订了新的目标
  8. tomcat7源代码Bootstrap
  9. ArcGIS 10.4 Desktop安装步骤。
  10. 从互联网跳到传统企业,我再也不精神内耗了
  11. [copypaste]各种表示法
  12. 2021年危险化学品经营单位安全管理人员报名考试及危险化学品经营单位安全管理人员考试资料
  13. Windows下网络共享文件夹挂载到wsl系统
  14. Bzoj3687简单题(bitset)
  15. Bailian2755 神奇的口袋【递归+DP】
  16. Python 爬虫实战1.0
  17. python正则表达式中括号的用法_Python的正则表达式中的圆括号到底如何使用?
  18. 中科创达 面试题目合集(2021.8)
  19. iOS开发-调用手机浏览器打开网址
  20. 项目实施中三个最关键的干系人

热门文章

  1. IOS开发自定义tableviewcell的注意点
  2. iOS 之NSOperation(一)
  3. Oracle表名、列名、约束名的长度限制
  4. [ 淘宝商城 ] 商城SEO
  5. IE 6里面当高度(height)小于9px时,高度会仍然是9px[解决办法]
  6. SceneCAD: Predicting Object Alignmentsand Layouts in RGB-D Scans
  7. 190602每日一句
  8. Atitti v5住宿服务部后勤部建设指引指南.docx
  9. Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
  10. Atitit 知识图谱解决方案:提供完整知识体系架构的搜索与知识结果overview