2011-10-06 36 views
2

請看下面的例子:在子類中覆蓋@OneToMany targetEntity?

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,但乍一看它不允許覆蓋目標實體。還是呢?

回答

3

在JPA的背景下似乎沒有辦法做到這一點。 Hibernate具有特定的元註釋來覆蓋超類的OneToMany註解。

與此同時它出現@AssociationOverride註釋只適用於標記有@MappedSuperclass的類。但是,它們不能用作OneToMany關聯中的目標實體。

雞和雞蛋的問題真的......還是它?

Java不允許覆蓋字段。但它適用於方法。如果超類使用屬性訪問,那麼THEN是有效的。讓子類重寫getter,然後你去! :-)

-2

只要你在Bar中使用繼承,那麼你不需要做任何事情。如果FooFoo與NewBar有關係,它們將被回讀。

否則,您可以向NewBar添加一個新字段,或將Bar關係向下移動到子類。

+0

但是如何?數據庫中沒有外鍵從FooFoo到NewBar。 JPA實施者的詭計? –