JPA中按身份引用

在上一篇文章中 ,我提到我选择通过其主键而不是类型来引用其他聚合。 在处理大型或复杂域模型时,我通常使用这种方法(也称为断开域模型)。 在这篇文章中,让我尝试进一步解释如何在JPA中完成它。 请注意,生成DDL脚本不会创建一个外键约束(不像所示的一个以前的帖子 )。

通过身份引用

在大多数JPA示例中,每个实体都引用另一个实体,或者被另一个实体引用。 这导致了对象模型,该对象模型允许从一个实体到任何其他实体的遍历。 这会导致不必要的遍历 (以及持久化操作的不必要的级联)。 这样,最好通过按ID(而不是按类型)引用其他实体来防止这种情况。

下面的代码显示OrderItem如何通过其主键(而不是类型)引用Product实体。

@Entity
public class Product {@Id private Long id;// ...
}@Entity
public class Order {// ...@OneToMany(mappedBy="order")private Collection<OrderItem> items;
}@Entity
public class OrderItem {// ...@ManyToOneprivate Order order;// @ManyToOne// private Product product;private Long productId;// ...
}

有几种获取关联的Product实体的方法。 一种方法是使用存储库查找具有ID的产品(具有findByIdIn(List<Long> ids)方法的ProductRepository )。 如之前的评论中所述,请注意不要以N + 1选择问题告终。

也可以使用自定义身份类型。 下面的示例使用ProductId 。 它是一个价值对象。 并且由于JPA,我们需要添加零参数构造函数。

@Embeddable
public class ProductId {private Long id;public ProductId(long id) {this.id = id;}public long getValue() { return id; }// equals and hashCodeprotected ProductId() { /* as required by JPA */ }
}@Entity
public class Product {@EmbeddedId private ProductId id;// ...
}@Entity
public class Order { // ...@OneToMany(mappedBy="order")private Collection<OrderItem> items;
}@Entity
public class OrderItem {// ...@ManyToOneprivate Order order;// @ManyToOne// private Product product;@Embedded private ProductId productId;// ...
}

但是,如果您将生成的值用于ID,则无法使用。 幸运的是,从JPA 2.0开始,围绕此有一些技巧,我将在下一部分中分享这些技巧。

生成的ID

在JPA中,当使用非@Basic类型作为@Id ,我们不能再使用@GeneratedValue 。 但是,通过混合使用属性和字段访问,我们仍然可以使用生成的值和ProductId

@Embeddable
@Access(AccessType.FIELD)
public class ProductId {...}@Entity
@Access(AccessType.FIELD)
public class Product {@Transient private ProductId id;public ProductId getId() { return id; }// ...private Long id_;@Id@GeneratedValue(strategy=...)@Access(AccessType.PROPERTY)protected Long getId_() { return id_; }protected void setId_(Long id_) {this.id_ = id_;this.id = new ProductId(this.id_);}
}@Entity
public class Order { // ...@OneToMany(mappedBy="order")private Collection<OrderItem> items;
}@Entity
public class OrderItem {// ...@ManyToOneprivate Order order;// @ManyToOne// private Product product;@Embedded private ProductId productId;// ...
}

诀窍包括将属性访问权限用于生成的ID值(同时保留其余访问权限)。 这将使JPA使用setter方法。 然后在其中初始化ProductId字段。 请注意, ProductId字段不会@Transient (标记为@Transient )。

希望这可以帮助。

翻译自: https://www.javacodegeeks.com/2016/07/reference-identity-jpa.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在idea下开发出现404错误

用idea开发时&#xff0c;我们一般要设置project strucure里的Modules-Sources,里面对应的有Sources,tests,Resources,Test Resources&#xff0c; Excluded。 同时也可以在maven的pom里面build标签里设置。 <resource><directory>src/main/webapp</directory&g…

MFC利用控制台输出调试信息的方法

VS2010中只要输入以下信息即可&#xff1a;editbin /SUBSYSTEM:CONSOLE $(OUTDIR)$(TargetName).exeVC6.0稍微复杂&#xff1a;打开菜单“Project”-“Setting”&#xff08;或者Alt-F7&#xff09;&#xff0c;打开选项卡“Post-builder step”&#xff08;Post-build步骤&…

一念成佛,一念成魔

一念成佛&#xff0c;一念成魔 前几天&#xff0c;因我与寝友的一次错误导致电脑系统崩溃&#xff0c;连开机都开不了了。可我发现我并不是很生气&#xff0c;只是用玩笑话调侃了他一下。后来想想&#xff0c;要是放在以前&#xff0c;我一定会大发脾气&#xff0c;几天都不去理…

Jquery操作基本筛选过滤器

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>层级选择器</title><link rel"stylesheet" href"../../css/style.css" type"text/css"/><script type"text/javascript…

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Visual C++利用互斥量同步线程实现文件读取进度条

忘了原文的位置了。 一、前言 文件读取进度条的实现可以有很多种方法,常用的是在读取文件的过程中隔一定时间向对话框发送消息以控制进度条的位置,但是这种方法很难确定隔多少时问发送一个消息,因为文件的大小是不确定的,时间间隔长了可能文件已经读取完了还没有发送消…

组件模块化使用

// 使用$attr可以直接在父元素上拿数据让子元素使用或者是孙元素使用 <template><div>props:{{name}},{{age}} 或者 {{$props[name]}},{{$props[age]}} <br>attrs: {{$attrs[gender]}} 在$attrs里面只会有props没有注册的属性</div> </template>…

jboss与nginx_JBoss BRMS与JasperReports进行报告

jboss与nginx介绍 Jasperreports是可免费下载的库&#xff0c;可用于为Java EE应用程序生成丰富的报告。 本指南还提供了使用Jasper iReport设计器生成报告模板的步骤。 软件需求 JBoss BRMS 5.3&#xff08;从客户门户网站http://access.redhat.com &#xff09; JasperRep…

VS2010发布、打包安装程序超全超详细

找不到原文链接 1、 在vs2010 选择“新建项目”“其他项目类型”“ Visual StudioInstaller “安装项目”&#xff1a; 命名为&#xff1a;Setup1 。 这是在VS2010中将有三个文件夹&#xff0c; 1.“应用程序文件夹”表示要安装的应用程序需要添加的文件&#xff1b; 2.“…

IntelliJ IDEA2017 激活方法 最新的

今天打开电脑&#xff0c;非常不幸&#xff0c;idea出问题了&#xff01;&#xff01;&#xff01;大部分人以前应该都是用的以下方法&#xff1a;1. 到网站 http://idea.lanyus.com/ 获取注册码2.填入下面的license server:http://intellij.mandroid.cn/   http://idea.imsx…

介绍HawkFX

如前所述&#xff0c; 我开始玩JRubyFX 。 对我来说&#xff0c;学习一些新的最佳方法可以解决用例&#xff0c;因此我开始为Hawkular创建库存浏览器。 为什么选择JRubyFX&#xff1f; 让我们首先从“什么是JRubyFX”开始&#xff1f; JRubyFX是通过JRuby引入Ruby世界的JavaFX…

C++ Unicode和ANSII转换

构造字符串和转换字符串是不一样的&#xff0c;构造字符串时往往是添加标记&#xff0c;这个过程其实是告诉编译器应该怎么在内存中存储&#xff1b;一旦构造好&#xff0c;对于内存中的一块地址&#xff0c;这些标记符就没用了&#xff0c;这个时候就得使用转换函数转换了。对…

创建win32 dll

新建项目->win32项目&#xff08;不是win32控制台&#xff09;->下一步中选择dll&#xff08;如果想生成lib&#xff0c;勾选导出符号&#xff09;。此时编译会生成对应的dll文件&#xff0c;但没有lib&#xff0c;只有有导出符号的时候才会生成lib文件。导出符号可以使用…

蓝桥杯 有几个星期日的问题.

1949年的国庆节&#xff08;10月1日&#xff09;是星期六。 今年&#xff08;2012&#xff09;的国庆节是星期一。那么&#xff0c;从建国到现在&#xff0c;有几次国庆节正好是星期日呢&#xff1f;只要答案&#xff0c;不限手段&#xff01;可以用windows日历&#xff0c;win…

storm问题汇总

1.删除了本地topology导致无法启动nimbus 删除storm的自定义的库中的数据 删除zookeeper中配置的dataDir中的数据 重启服务即可 转载于:https://www.cnblogs.com/ives/p/9165850.html

带有API网关的AWS Lambda

在上一篇文章中&#xff0c;我向您展示了如何创建和部署AWS Lambda。 我们将继续这项工作&#xff0c;并只考虑更新该lambda的代码。 我们还将使用AWS API Gateway将REST端点添加到AWS Lambda。 因此&#xff0c;在继续之前……&#xff08;如果尚未使用&#xff09;&#xff…

获取焦点

win32 API:HWND SetFocus&#xff08;HWND hWnd&#xff09;MFC直接CWnd::SetFocus();参数&#xff1a;hWnd&#xff1a;接收键盘输入的窗口指针。若该参数为NULL&#xff0c;则击键被忽略。返回值&#xff1a;若函数调用成功&#xff0c;则返回原先拥有键盘焦点的窗口句柄。若…

树的问题?

题目&#xff1a; 一个深度为L的满k叉树有如下性质&#xff1a;第L层上的结点都是叶子结点&#xff0c;其余各层上每个结点都有k棵非空子树。如果按层数顺序从1开始对全部结点编号&#xff0c;问&#xff1a; &#xff08;1&#xff09;各层的结点数目是多少&#xff1f; &a…

HibernateTemplate

org.springframework.orm.hibernate5.HibernateTemplate 这是spring-orm-4.3.4.RELEASE.jar包中的一个类&#xff0c;这个类是对Hibernate进行了封装&#xff1b; 这是可以进行注入的属性&#xff0c;需要注入sessionFactory属性&#xff0c;因此我们需要创建一个sessionFactor…

使用电脑无线网卡分享网络命令

netsh wlan set hostednetwork modeallow ssidYourWifiName keyYourWifiPasswordnetsh wlan start hostednetworknetsh wlan show hostednetworkpause