【问题标题】:Hibernate Annotations/JPA mapping collectionsHibernate Annotations/JPA 映射集合
【发布时间】: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,它应该返回一个包含三个项目的订单对象?

谢谢大家

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

【问题讨论】:

    标签: java hibernate jpa annotations


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多