JPA:持久化Map <string,entity> </string,entity>

时间:2013-09-27 04:12:57

标签: java jpa eclipselink

当String不是实体映射的关键字时,你能帮助持久化Map吗? 例如:

class A {

   @Id
   long id;

   String code;
}

class B {

   @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
   @What magical combination of JPA annotations should I use here?! 
   Map<String,A> mapAByCode;

}

我已经尝试了很多{@ JoinTable,@ MapKeyColumn,@ JoinColumn,@ JoinTable}注释的组合但没有成功,我会发疯...

谢谢!

2 个答案:

答案 0 :(得分:0)

由于您似乎想要使用A.code值映射您的实体,@ MapKey就是您所追求的。 @MapKey允许您定义引用中的值以用作映射的键​​。正如javadoc所述,它必须是唯一的,否则你会遇到问题。

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
  @MapKey(name="code")
  Map<String,A> mapAByCode;

答案 1 :(得分:0)

似乎问题与我在同一个类中使用的其他地图有关:

@Entity
class A {

  @Id
  long id;

  String code;
}

@Entity
class B {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinTable(name = "B_MAPABYID", joinColumns = @JoinColumn(name = "B_ID"))
    @MapKey(name="id")
    Map<Long,A> mapAById;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinTable(name = "B_MAPABYCODE", joinColumns = @JoinColumn(name = "B_ID"))
    @MapKey(name="code")
    Map<String,A> mapAByCode;

}

此配置对我不起作用,但如果我将mapAById设置为瞬态,则一切正常。这对你有意义吗?