使用JPA映射java.util.Map

时间:2012-07-24 12:54:21

标签: hibernate jpa mapping many-to-many map

我有带有Hibernate映射类的Java EE应用程序(我使用* .hbm.xml映射)。 现在我需要使用JPA注释重新映射映射。一切都很好,但我无法使用我的Map属性创建正确的映射。

@Entity
@Table(name = DataBaseConstants.EMPLOYEE_TABLE)
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = DataBaseConstants.EMPLOYEE_ID, sequenceName = DataBaseConstants.EMPLOYEE_SEQ)
@GeneratedValue(generator = DataBaseConstants.EMPLOYEE_ID)
@Column(name = DataBaseConstants.EMPLOYEE_ID)
private long id = 0;
@Column(name = DataBaseConstants.EMPLOYEE_NAME)
private String name = null;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = DataBaseConstants.ADDRESS_ID_FK)
private Address address = null; 

private Map<Office, Position> officePositions = null;

以下是数据库中数据模型的一部分。 DB MODEL IMAGE  (抱歉,我无法发布图片) 请帮我映射officeEmployee MAP

在Hibernate中我使用这种方式,一切都很好。

<map name="officePositions" table="EMPLOYEE_POSITION_OFFICE" lazy="false"
                fetch="join" batch-size="100">
            <key>
            <column name="EMPLOYEE_ID"></column>
        </key>
        <map-key-many-to-many class="com.example.jpajdbctask.entities.Office">
            <column name="OFFICE_ID">
            </column>
        </map-key-many-to-many>
        <many-to-many column="POSITION_ID"
            class="com.example.jpajdbctask.entities.Position" />
        </map> 

2 个答案:

答案 0 :(得分:1)

我自己从未使用它,所以我无法帮助您完全实现,但您需要使用@CollectionOfElements注释,例如:

@CollectionOfElements(fetch=FetchType.EAGER)
@JoinTable(
    name = "MappingTable", 
    joinColumns = @JoinColumn(name = "mapOwner"))
@Column(
   name = "mapValueItem", 
   nullable = false
)  
@org.hibernate.annotations.MapKey(
    columns={
        @Column(
             name="mapKeyItem"
        )
   }
)
protected Map<String, String> getMapping() {
    return mapping_;
}

this论坛可能会有所帮助。

答案 1 :(得分:0)

对于基本情况(其中key是某些原语),这里是一个带有示例的MapKey注释的JavaDoc。

似乎在你的情况下应该使用@MapKeyColumn;这是一个example,与你的非常相似。

您必须将Employee课程中的地图更改为Map<Office, EmployeePositionOffice>