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 映射集合的主要内容,如果未能解决你的问题,请参考以下文章