JPA映射到Map <object,integer =“”> </object,>

时间:2014-08-11 03:06:39

标签: java hibernate jpa orm

我有3张桌子: - lots:列gen_id
- onhand_quantities:列gen_id,sub_inventory_code,数量
- subinventory:列sub_inventory_code

我映射到2个对象:Lots,SubInventory和我想在对象Lots中映射属性为:Map<SubInventory, Integer> getOnhandQuantity()
此Map中的整数类型是quantity列的值。 请帮帮我。

2 个答案:

答案 0 :(得分:1)

只需在Hibernate文档中进行简短搜索,即可获得有关使用关联实体作为地图关键字的信息(又名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>
     

第二种方法是将关联重新构建为实体类。   这是最常用的方法。最后一种选择是使用   复合元素,将在后面讨论。

将其映射回原始示例:公司 - &gt;很多,员工 - &gt; SubInventory,Contract - &gt; OnhandQuantity

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


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

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

}

答案 1 :(得分:1)

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
}