【问题标题】:JPA mapping to Map<Object, Interger>JPA 映射到 Map<Object, Integer>
【发布时间】:2014-08-11 03:06:39
【问题描述】:

我有 3 张桌子: - 批次:有列 gen_id
- onhand_quantities:有列 gen_id、sub_inventory_code、数量
- 子库存:有列 sub_inventory_code

我映射到 2 个对象:Lots、SubInventory,我想映射到具有属性的对象很多:Map&lt;SubInventory, Integer&gt; getOnhandQuantity()
此 Map 中的整数类型是数量列的值。 请帮帮我。

【问题讨论】:

  • 我相信lots 中应该有lot_id 之类的东西,onhand_quantities 中也应该有lot_id 对吗?如果没有,整体设计对我来说没有意义
  • @duykaka 我下面的答案希望你能够实施。

标签: java hibernate jpa orm


【解决方案1】:

只需在 Hibernate 文档中进行简短搜索,即可获得有关使用关联实体作为 Map 键的信息(又名 Ternary Association

引自手册:

映射三元关联有三种可能的方法。 一种方法是使用带有关联的 Map 作为其索引:

示例 7.31。三元关联映射

@Entity
public class Company {
   @Id 
   int id;
   ...
   @OneToMany // unidirectional
   @MapKeyJoinColumn(name="employee_id")
   Map<Employee, Contract> contracts;
}

// or

<map name="contracts">
    <key column="employer_id" not-null="true"/>
    <map-key-many-to-many column="employee_id" class="Employee"/>
    <one-to-many class="Contract"/>
</map>

第二种方法是将关联重塑为实体类。 这是最常见的方法。最后一种选择是使用 复合元素,后面会讲到。

将其映射回您的原始示例:公司 -> 批次、员工 -> 子库存、合同 -> 手头数量

就我个人而言,我宁愿将它们作为一种简单的关系,并在需要时即时构建 Map 等。


还没有尝试过,但是进一步看一下@MapKeyColumn 中的一个例子,结合上面的例子,应该给出一些合理的东西,比如:

class Lot {
    @ElementCollection
    @MapKeyJoinColumn(name="sub_inventory_id")
    @CollectionTable(name="onhand_quantities")
    @Column(name="quantity")
    private Map<SubInventory, Integer> onhandQuantities;

}

【讨论】:

  • '@CollectionTable(name="onhand_quantities")' 我们需要添加 joinColumn 是 gen_id。谢谢
【解决方案2】:

Lots 实体中的以下代码应该可以。

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "ONHAND_QUANTITIES", joinColumns= @JoinColumn(name="GEN_ID"))
@MapKeyJoinColumn(name="SUBINVENTORY_CODE")
@Column(name="QUANTITY")
private Map<SubInventory, Integer> onHandQuantity;

我正在尝试对此进行测试。

我从下面的链接中得到了这个解决方案。

Reference key issue while doing many to many relationship using @ElementCollection, @MapKeyJoinColumn

@Entity
@Table(name = "LOTS")
public class Lots implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "GEN_ID")
    private Long id;

    @ElementCollection(fetch = FetchType.LAZY)
    @CollectionTable(name = "ONHAND_QUANTITIES", joinColumns= @JoinColumn(name="GEN_ID"))
    @MapKeyJoinColumn(name="SUBINVENTORY_CODE")
    @Column(name="QUANTITY")
    private Map<SubInventory, Integer> onHandQuantity;

   ......// getters and setters
}


@Entity
@Table(name = "SUBINVENTORY")
public class SubInventory implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name="SUBINVENTORY_CODE")
    private Long id;

    ......// getters and setters
}

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2019-12-17
    • 2017-11-25
    • 2013-11-28
    • 2010-10-25
    • 2014-06-25
    相关资源
    最近更新 更多