根据Hibernate文档,如果我们要将Map用作实体之间的关联,则有多个注释可用。医生说:
或者,将映射键映射到一个或多个专用列。为了自定义映射,请使用以下注释之一:
@MapKeyColumn(如果地图关键字是基本类型)。如果未指定列名,则使用属性名称,下划线和KEY(例如orders_KEY)。@MapKeyEnumerated
/ @MapKeyTemporal(如果地图键类型分别是枚举或日期)。@ MapKeyJoinColumn / @
MapKeyJoinColumns(如果地图键类型是另一个实体)。@ AttributeOverride / @
AttributeOverride当地图关键字是可嵌入对象时。使用密钥。作为可嵌入对象属性名称的前缀。如果您不使用泛型,也可以使用@MapKeyClass定义键的类型。
通过执行一些示例,我能够理解@MapKey仅用于将键映射到目标实体的属性,并且该键仅用于获取记录。@MapKeyColumn用于将键映射到目标实体的属性,并且该键用于保存以及获取记录。请让我知道这是否正确吗?
另外,请告诉我何时需要使用@ MapKeyJoinColumn / @ MapKeyJoinColumns和@MapKeyEnumerated /
@MapKeyTemporal
谢谢!
使用a时,Map
您始终需要关联至少两个实体。假设我们有一个Owner
与该Car
实体相关的实体(Car
具有FK Owner
)。
所以,Owner
就有了Map
的Car(s)
:
Map<X, Car>
@MapKey
该@MapKey
会给你Car's
用来集团的物业Car
其Owner
。例如,如果我们在中具有vin
(车辆识别号)属性Car
,则可以将其用作carMap
键:
@Entity
public class Owner {
@Id
private long id;
@OneToMany(mappedBy="owner")
@MapKey(name = "vin")
private Map<String, Car> carMap;
}
@Entity
public class Car {
@Id
private long id;
@ManyToOne
private Owner owner;
private String vin;
}
@MapKeyEnumerated
该@MapKeyEnumerated
会使用枚举从Car
,像WheelDrive
:
@Entity
public class Owner {
@Id
private long id;
@OneToMany(mappedBy="owner")
@MapKeyEnumerated(EnumType.STRING)
private Map<WheelDrive, Car> carMap;
}
@Entity
public class Car {
@Id
private long id;
@ManyToOne
private Owner owner;
@Column(name = "wheelDrive")
@Enumerated(EnumType.STRING)
private WheelDrive wheelDrive;
}
public enum WheelDrive {
2WD,
4WD;
}
这将根据其WheelDrive类型对汽车进行分组。
@MapKeyTemporal
该@MapKeyTemporal
会使用Date
/ Calendar
场进行分组,像createdOn
。
@Entity
public class Owner {
@Id
private long id;
@OneToMany(mappedBy="owner")
@MapKeyTemporal(TemporalType.TIMESTAMP)
private Map<Date, Car> carMap;
}
@Entity
public class Car {
@Id
private long id;
@ManyToOne
private Owner owner;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="created_on")
private Calendar createdOn;
}
@MapKeyJoinColumn
将@MapKeyJoinColumn
需要第三个实体,就像Manufacturer
让你从这样一个联合体Owner
,以Car
与汽车也已经关联到Manufacturer
,让您可以将所有Owner's
Cars
的Manufacturer
:
@Entity
public class Owner {
@Id
private long id;
@OneToMany(mappedBy="owner")
@MapKeyJoinColumn(name="manufacturer_id")
private Map<Manufacturer, Car> carMap;
}
@Entity
public class Car {
@Id
private long id;
@ManyToOne
private Owner owner;
@ManyToOne
@JoinColumn(name = "manufacturer_id")
private Manufacturer manufacturer;
}
@Entity
public class Manufacturer {
@Id
private long id;
private String name;
}
问题内容: 但没人回答我的下一个问题。经典的hibernate方法使用和JPA 实现之间有什么区别?我听说此JPA实现使用并像包装器一样工作,这是真的吗? 问题答案: 确实。 JPA只是一个API,允许您从使用的持久层中进行抽象。Hibernate提供了充当接口的实现,它使用与Hibernate 相同的基础方法。 这个想法是,例如,您可以将实现切换到Eclipse Link,而不必更改任何源代码。
问题内容: 当我使用@Entity注释类并尝试解析依赖项时,我可以在两个不同的包javax.persistence.Entity和org.hibernate.annotations.Entity中选择包。 javax包是JPA的实体注释,但是为什么会有hibernate的实体注释,它与JPA的注释有区别?仅仅是允许定义更多属性的扩展吗? 问题答案: 具有一些尚未标准化的额外属性。仅当直接使用hib
问题内容: Hibernate中的persist()和merge()有什么区别? 可以创建UPDATE&INSERT查询,例如: 在这种情况下,将生成 查询, 如下所示: 因此方法可以 生成 一个插入和一个更新。 现在: 这是我在数据库中看到的: 现在使用更新记录 这是我在数据库中看到的: 问题答案: JPA规范包含对这些操作的语义的非常精确的描述,比在javadoc中更好: 应用于实体X 的 p
本文向大家介绍JDBC和Hibernate之间的区别,包括了JDBC和Hibernate之间的区别的使用技巧和注意事项,需要的朋友参考一下 JDBC是Java数据库连接的首字母缩写。它用于将您的应用程序连接到数据库和事务。它是一个开源Java api。 Hibernate还用于将您的应用程序连接到数据库并执行与数据库相关的事务,但是使用不同的方法。它有一个对象关系库,该库将java的对象映射到
本文向大家介绍Hibernate中get()和load()之间的区别,包括了Hibernate中get()和load()之间的区别的使用技巧和注意事项,需要的朋友参考一下 在休眠模式下,and是两种用于获取给定标识符的数据的方法。它们都属于Hibernate会话类。如果给定标识符的会话高速缓存或数据库中没有可用的行,则方法返回null,而方法抛出未找到对象的异常。 序号 键 得到() 加载()
本文向大家介绍Hibernate中save()和persist()之间的区别,包括了Hibernate中save()和persist()之间的区别的使用技巧和注意事项,需要的朋友参考一下 Save()和这两种方法都用于在数据库中保存对象。 根据文档- Save()-坚持给定的瞬时实例,首先分配一个生成的标识符。(或者,如果使用分配的生成器,则使用标识符属性的当前值。)如果关联是用cascade