当前位置: 首页 > 面试题库 >

JPA和Hibernate中@ MapKey,@ MapKeyColumn和@MapKeyJoinColumn之间的区别

谢唯
2023-03-14
问题内容

根据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就有了MapCar(s)

Map<X, Car>

@MapKey

@MapKey会给你Car's用来集团的物业CarOwner。例如,如果我们在中具有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
CarsManufacturer

@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