- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这张 map :
Map<Owner, Integer> ownerSharesMap = new HashMap<>();
我知道如何将 HashMap
与 @OneToMany
关系进行映射,该关系以原始类型作为键,但我在 google 上搜索了很多并没有找到映射的方法上面的 HashMap
与 JPA。不过,我看到了两个选项:
将我的 HashMap
更改为:(其中 uuid 是 Owner
的键列)
Map<UUID, Integer> ownerIdSharesMap = new HashMap<>();
或者创建一个这样的类:
public class Share{
int count;
Owner owner
}
然后持久化这个集合:
Set<Share> shares;
你有什么建议?有没有办法用 JPA 注释第一个 Map 还是我应该使用后面的解决方案?
请注意,在我的项目中,查询性能是主要关注点,但我也想要干净的 OOD。
谢谢。
最佳答案
这在 JPA 中是可能的。
map 集合中的值不是实体,因此您需要使用 @ElementCollection
对其进行映射。
您的映射可以像这样简单:
@ElementCollection
private Map<Owner, Integer> ownerSharesMap = new HashMap<Owner, Integer>();
不过,您可以指定一个集合表来存储这些值。使用 @CollectionTable
注释,您可以指定集合表的名称以及连接列。
@ElementCollection
@CollectionTable(name="OWNER_SHARES",
joinColumns=@JoinColumn(name="SHARE_ID"))
private Map<Owner, Integer> ownerSharesMap = new HashMap<Owner, Integer>();
如果未指定@CollectionTable
,表名将默认为引用实体的名称,并附加下划线和包含元素集合的实体属性的名称。在我们的示例中,这将是 SHARE_OWNERSHARESMAP
。连接列默认是引用实体的名称,附加下划线和实体表的主键列的名称。
可以使用@Column
注解,来指定集合表中哪一列是映射集合表的整数值。如果未指定,这将默认为 OWNERSHARESMAP
。
@ElementCollection
@CollectionTable(name = "OWNER_SHARES", joinColumns = @JoinColumn(name = "SHARE_ID") )
@Column(name="SHARE_AMOUNT")
private Map<Owner, Integer> ownerSharesMap = new HashMap<Owner, Integer>();
按实体键控时,并非实体的所有属性都会存储在集合表中。它只是将要存储的实体的主键。为此,我们将在集合表中增加一列来存储 map 的键,即 Owner 实体主键的外键。要覆盖此列的名称,您可以使用 @MapKeyJoinColumn
。
@ElementCollection
@CollectionTable(name="OWNER_SHARES", joinColumns=@JoinColumn(name="SHARE_ID"))
@Column(name="SHARE_AMOUNT")
@MapKeyJoinColumn(name="OWNER_KEY")
private Map<Owner, Integer> ownerSharesMap = new HashMap<Owner, Integer>();
如果不指定@MapKeyJoinColumn,则默认的列名将是元素集合属性的名称,并附加字符串“_KEY”。因此,在我们的示例中,这将是 OWNERSHARESMAP_KEY
。
下面是您的实体在代码中的外观示例:
@Entity
@Table(name="OWNER")
public class Owner {
@Id
@Column(name="OWNER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
...
}
@Entity
@Table(name = "SHARE")
public class Share {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "SHARE_ID")
private Integer id;
@ElementCollection
@CollectionTable(name = "OWNER_SHARES", joinColumns = @JoinColumn(name = "SHARE_ID") )
@Column(name="SHARE_AMOUNT")
@MapKeyJoinColumn(name = "OWNER_KEY")
private Map<Owner, Integer> ownerSharesMap = new HashMap<Owner, Integer>();
...
}
下面是保存实体及其集合的示例代码:
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Owner owner1 = new Owner();
Owner owner2 = new Owner();
em.persist(owner1);
em.persist(owner2);
Share share = new Share();
share.getOwnerSharesMap().put(owner1, 20);
share.getOwnerSharesMap().put(owner2, 40);
em.persist(share);
em.getTransaction().commit();
下面是 Hibernate 如何在 MySQL 中生成模式:
Hibernate:
create table OWNER (
OWNER_ID integer not null auto_increment,
primary key (OWNER_ID)
)
Hibernate:
create table OWNER_SHARES (
SHARE_ID integer not null,
SHARE_AMOUNT integer,
OWNER_KEY integer not null,
primary key (SHARE_ID, OWNER_KEY)
)
Hibernate:
create table SHARE (
SHARE_ID integer not null auto_increment,
primary key (SHARE_ID)
)
Hibernate:
alter table OWNER_SHARES
add constraint FK_th03t34g0d8hj7hmhppaa9juk
foreign key (OWNER_KEY)
references OWNER (OWNER_ID)
Hibernate:
alter table OWNER_SHARES
add constraint FK_smwhicxpq0ydqan5jn1p3goom
foreign key (SHARE_ID)
references SHARE (SHARE_ID)
表格中的数据如下所示:
您将在我的 GitHub repo 中看到此实现的示例.
关于java - 如何用JPA注解Map<Entity,INTEGER>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267131/
注解@CrossOrigin 出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站。来自EVILL的脚本
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章深入理解Java高级特性——注解由作者收集整理,如果你对这篇文章有兴趣,
概述 在这个快速教程中,我们将探索 Spring 的 @RequestParam 注解。 简单地说,我们可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至文件。我们将讨论如何使用
我有一个关于 Spring @Async 注释的问题。我有一个 Controller 自动连接了一个服务(GnInsuranceDetailsService) @RequestMapping(va
我在使用注释来调用注释所属的方法时遇到了一些麻烦......我将举一个例子: class MyEventHandlers { @handler(id=“1”) public doSom
我是.Net程序员,但是这次我正在从事Java项目,并且遇到了一些困难。这个 java 项目不是我的,它是由其他开发人员开发的,并且使用 Hibernate。 当我运行 Ant 构建器时,我收到此错误
我在 Grails 文档(第 9 章:测试)中读到过这个注解。但是我不明白这是什么... 问题是我需要模拟 GORM 的动态方法,有一种方法可以自动模拟它们,而不必编写我需要的所有方法吗? 最佳答案
这个问题在这里已经有了答案: How to get annotation class name, attribute values using reflection (2 个答案) 关闭 5 年前。
如何了解 Java EE 6 JMS 注释规范支持的所有有效属性集@ActivationConfigProperty Java EE 6 Documentation for @ActivationCo
我认为这是不可能的,但也许我错了。所以我问你,如果可能的话。 ;-) 如果我定义了一个注释,它只接受类引用,它扩展了一些可能的接口(interface)或类: Class serviceIFProv
我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 没有检查参数是否为 null。 这是我的类(class): Person.class public
我是 hibernate 新手,我正在尝试学习它,但在尝试使一对多关系正常工作时遇到了问题。我尝试了几个例子,但似乎没有一个起作用。 有人可以看一下下面的代码并告诉我哪里出了问题吗?我尝试了很多不同的
这个问题已经有答案了: Why doesn't Java offer operator overloading? (17 个回答) 已关闭 9 年前。 每个人都知道 Java 中的简单算术如何用于基元
有人知道如何用 Python 处理这种 XML 注释,这是我第一次看到。 <?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd
我遇到了这个link这解释了如何继承 bean。假设此示例中的 HelloWorld 类使用 @Component 注释作为 bean 公开,如何创建另一个继承此 bean 的 bean?我可以使用
谁能告诉我这段代码是否: public class OvTester { @Override public int hashCode() { return toStri
我有一个实体,它有一个非键列,我已将其设置为在我的数据库中自动生成。 我不能使用 @GeneratedValue,因为据我所知,它仅适用于关键字段。 在这种情况下,如何指示非键列是自动生成的? 最佳答
所以可能像很多人一样,我通常会临时注释掉代码,主要是为了调试目的。我目前放了类似 **DEBUG** 或任何容易搜索的内容,但我认为让编译器在发现临时注释掉的代码时输出警告(甚至错误)可能很有用。我想
此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」 本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 b
配置全局乱码过滤器 参数绑定注解@RequestParam 注解@RequestParam的参数使用说明 获得Restful风格的参数 自定义类型转换器 自定义转换器的开发步骤: 获得Servlet相
我是一名优秀的程序员,十分优秀!