2011-09-21 61 views
0

我有一個超類產品和一個子類減少。現在我想讓子類覆蓋超類的屬性,所以它不會保留在數據庫中。我鼓勵它像這樣工作,但顯然休眠仍嘗試將Reduce的ProductType屬性存儲在數據庫中。有其他方法可以解決這個問題嗎?JPA,瞬態註釋不會覆蓋OneToOne?

@Entity 
@Table(name="PRODUCT_INSTANCE") 
public class Product { 
    private Integer id; 
    protected ProductType productType; 

    public Product(){ 

    } 

    public Product(ProductType productType) { 
     this.productType = productType; 
    } 

    @OneToOne 
    public ProductType getProductType() { 
     return productType; 
    } 

    public void setProductType(ProductType type) { 
     this.productType = type; 
    } 

    @Transient 
    public ProductCategory getCategory() { 
     return productType.getCategory(); 
    } 
} 

類和子類:

@Entity 
@Table(name="REDUCTION") 
public class Reduction extends Product { 

    private ProductType type; 
    private Integer id; 

    public Reduction(Double percentage, Double totalPrice) { 

     ProductCategory reductionCat = new ProductCategory("_REDUCTION_", new Color("", 130, 90, 80)); 
     type = new ProductType(); 
     type.setBuyPrice(0.0); 
     type.setBtw(BTW.PER_0); 
     type.setCategory(reductionCat); 
    } 

    @Override 
    @Transient 
    public ProductType getProductType() { 
     return type; 

    } 
} 

回答

0

您正在尋找

@Entity 
@Table(name="REDUCTION") 
@AttributeOverride(name = "productType", column = @Column(name = "productType", nullable = true, insertable = false, updatable = false)) 
public class Reduction extends Product { 
    @Override 
    public ProductType getProductType() { 
     return type; 

    } 
} 
+0

沒有,實際上沒有做我想要的,AttributeOverride只是讓休眠保存productType在不同的列。我想要的是,reduce類沒有保存productType。 –

+0

看看代碼 – ssedano

+0

那麼即使有了這些修改,hibernate仍然抱怨說,它不能保存ProductType,因爲它是一個臨時對象(當它試圖持久化Reduce對象時)。 –

0

我解決它使用一種變通方法,以減少我把

@Transient 
public ProductType getProductHack(){ 
    return type; 
} 

,並在類產品:

@OneToOne 
public ProductType getProductType() { 
    return productType; 
} 

public void setProductType(ProductType type) { 
    this.productType = type; 
} 

@Transient 
public ProductType getProductHack() { 
    return getProductType(); 
} 

public void setProductHack(ProductType type) { 
    setProductType(type); 
} 

這是醜陋的,但到目前爲止,這是唯一可行的選擇。開始懷疑原始問題是否是休眠時的錯誤。