JPA 2.0使用一个@JoinedTable映射两个相同类型的集合

时间:2012-05-16 19:05:55

标签: hibernate jpa-2.0

假设我有以下实体:

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

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @OneToMany
  @JoinTable(name="A_B", joinColumns = @JoinColumn(name = "A_ID"),
    inverseJoinColumns = @JoinColumn(name = "B_ID"))
  private List<B> bList1;

  @OneToMany
  @JoinTable(name="A_B", joinColumns = @JoinColumn(name = "A_ID"),
    inverseJoinColumns = @JoinColumn(name = "B_ID"))
  private List<B> bList2;

  // getters and setters

}

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

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  //some other data
  //getters and setters
}

@JoinTable结构就像是:

A_B (a_id, b_id, discriminator);

是否可以使用一些注释来指定鉴别器列,基于哪个bList1和bList2将被填充?

1 个答案:

答案 0 :(得分:1)

发布代码是不可能的,因为即使你可以指定集合上的@Where("discriminator='list1'")@Where("discriminator='list2'")来检索时进行过滤,但是在插入/更新时,hibernate仍然不会保留鉴别器。 / p>

你可以尝试做这项工作(我没有测试过这个):

@ManyToAny(metaColumn = @Column( name = "discriminator" ) )
@AnyMetaDef(idType = "long", metaType = "string", metaValues = {
    @MetaValue( value = "list1", targetEntity = B.class ) } )
private List<B> bList1;

@ManyToAny(metaColumn = @Column( name = "discriminator" ) )
@AnyMetaDef(idType = "long", metaType = "string", metaValues = {
    @MetaValue( value = "list2", targetEntity = B.class ) } )
private List<B> bList2;

或者你只是为jointable创建一个具有鉴别器值的类,并在list1和2的属性中处理它。