覆盖子类中的@OneToMany targetEntity?

时间:2011-10-06 12:12:31

标签: jpa jpa-2.0

考虑以下示例:

public interface Bar {
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public DefaultBar implements Bar {

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private long id;

}

@Entity
public class Foo {

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private long id;

  @OneToMany(cascade = CascadeType.ALL, targetEntity = DefaultBar.class)
  @JoinColumn(name = "FOO_ID")
  private Collection<Bar> bars;

  public Collection<Bar> getBars() {
    return bars;
  }
}

这样就可以了。但是 - 假设我将成为Foo的子类;说FooFoo。我希望“酒吧”协会也指向Bar的新实现。说:

@Entity
public NewBar extends DefaultBar {

}

现在我想注释FooFoo,以便将“bars”字段的目标实体设置为NewBar类。

@Entity
@AssociationOverride(name="bars", ???????)
public class FooFoo extends Foo {

}

我注意到注释@AssociationOverride,但乍一看它不允许覆盖目标实体。或者是吗?

2 个答案:

答案 0 :(得分:3)

在JPA的背景下似乎没有办法做到这一点。 Hibernate具有特定的元注释来覆盖超类的OneToMany注释。

与此同时,似乎@AssociationOverride注释仅适用于标有@MappedSuperclass的类。但是他们不能在OneToMany协会中用作目标实体。

鸡蛋和鸡蛋问题真的......或者是它?

Java不允许覆盖字段。但它确实适用于方法。如果超类使用属性访问,则THEN有效。让子类覆盖getter,然后你就去了! : - )

答案 1 :(得分:-2)

只要你在Bar中使用继承,那么你就不需要做任何事情了。如果FooFoo与NewBar有关系,他们将被回读。

否则,您可以向NewBar添加新字段,或将Bar关系向下移动到子类。