Hibernate Annotations/JPA 映射集合

Posted

技术标签:

【中文标题】Hibernate Annotations/JPA 映射集合【英文标题】:Hibernate Annotations/JPA mapping collections 【发布时间】:2011-05-01 15:44:20 【问题描述】:

我的问题是关于在 Hibernate 中使用 JPA 注释映射集合。说,我有一个实体:

@Entity
@Table(name="orders")
class Order 
@Id @GeneratedId private Long id;
@OneToMany(fetch=FetchType.EAGER, targetEntity=Item.class)
@JoinColumn(name="order_id")
private List<Item> items;
/* getters setters */

还有我的物品:

@Entity
@Table(name="items")
class Item 
@Id @GeneratedId private Long id;
@ManyToOne
@JoinColumn(name="order_id")
private Order order;
/* getters setters */

order_id 是 items 表中的外键,它引用具有该 id 的订单。 如果我在 items 表中有 3 个订单项,我会得到三个订单对象,而不是一个在 items 集合中包含三个项目的对象,如果我查询:

Query query = query.createQuery("from Order o where o.id=:id");
query.setLong("id", 1234L);
List<Order> orders = query.list();

query.list() 返回三个订单实例。 如何使用 hibernate 3.5.x 映射此类基本集合? list() 的结果类似于 DB 上的 SQL 语句返回的结果。我怎么说 Hibernate/JPA,它应该返回一个包含三个项目的订单对象?

谢谢大家

更新:关联是单向的。这意味着,订单表没有关于项目的信息。

【问题讨论】:

【参考方案1】:

您需要指定mappedBy,并删除订单类上的@JoinColumn:

@Entity
@Table(name = "orders")
public class Order 
@Id
@GeneratedValue
private Long id;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "order")
private List<Item> items;

// accessors



@Entity
@Table(name = "items")
public class Item 
@Id
@GeneratedValue
private Long id;

@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
    // accessors

【讨论】:

以上是关于Hibernate Annotations/JPA 映射集合的主要内容,如果未能解决你的问题,请参考以下文章

hibernate问题

Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别

hibernate.merge()方法怎么用

hibernate 异常 怎么解决

Hibernate之Hibernate环境配置

(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件