我有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列的值。
请帮帮我。
答案 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;
我正在尝试测试它。
我从以下链接获得了这个解决方案。
@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
}