2017-06-19 65 views
1

我有一個Record實體與Product_Category表和Price_Category表保持@ManyToOne關係。記錄實體還維護一個與另一個名爲PendingRecords的表的關聯@OneToMany如何在使用hibernate update()時對具有多個@ManyToOne關聯的實體限制關聯表

目前,這是完美的休眠保存/堅持,其中所有相關的表也得到修改時滿足特定的條件。問題是這些關聯的實體也在考慮hibernate更新/刪除,這不是我打算做的事情。我想限制這些實體不被考慮,只允許在插入時進行更改。

以下是實體類的映射

Record.java

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name = "ITEM_RECORDS") 
public class Record { 

------------------------- 


@ManyToOne(optional=false) 
@JoinColumn(name = "PRICE_CATEGORY", referencedColumnName="price_category", nullable=false) 
private PriceCategory price_category; 

@ManyToOne(optional=false) 
@JoinColumn(name = "PRODUCT_CATEGORY", referencedColumnName="product_category", nullable=false) 
private ProductCategory product_category; 

@OneToOne(mappedBy="record", cascade = CascadeType.ALL) 
private PendingRecords pendingRecord; 

---------------------- 

(getter setter methods) 

----------------------- 

以下是相關聯的表

PriceCategory.java

@Entity 
@Table(name = "PRICE_CATEGORY") 
public class PriceCategory{ 

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

@Column(name = "PRICE_CATEGORY") 
private String price_category; 

@Column(name = "DESCRIPTION") 
private String description; 

---------------------------- 

(getter-setters) 

---------------------------- 

ProductCategory.java

@Entity 
@Table(name = "PRODUCT_CATEGORY") 
public class ProductCategory { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "ID") 
private Long id; 

@Column(name = "PRODUCT_CATEGORY") 
private String product_category; 

@Column(name = "DESCRIPTION") 
private String description; 

---------------------------- 

(getter-setters) 

---------------------------- 

最後,

PendingRecords.java

@Entity 
@Table(name = "PENDING_RECORDS") 
public class PendingRecords{ 


@Id 
@Column(name = "PENDING_RECORD_NO") 
@GeneratedValue(generator="gen") 
@GenericGenerator(name="gen", strategy="foreign",[email protected](name="property", value="record")) 
private Long pending_record_id; 

---------------------- 

@OneToOne 
@PrimaryKeyJoinColumn 
private Record record; 

------------------------- 

(getters-setters) 

------------------------- 

的實體,當我執行插入(休眠持續/保存)協會工作正常。問題是,當我嘗試更新記錄,Hibernate是試圖更新所有相關條目也喜歡

select 
    this_.RECORD_NO as REC_REC1_1_3_, 

    this_.PRICE_CATEGORY as PRICE_CA10_1_3_, 

    this_.PRODUCT_CATEGORY as PRODUCT11_1_3_, 

    pricecatego2_.id as id1_0_0_, 
    pricecatego2_.PRICE_CATEGORY as PRICE_CAT2_0_0_, 
    pricecatego2_.DESCRIPTION as DESCRIPT3_0_0_, 
    productcat3_.ID as ID1_3_1_, 
    productcat3_.DESCRIPTION as DESCRIPT2_3_1_, 
    productcat3_.PRODUCT_CATEGORY as PRODUCT_3_3_1_, 
    pendingrec4_.PENDING_RECORD_NO as REC_REC1_2_2_, 
    --------------------------- 
    from 
     ITEM_RECORDS this_ 
    inner join 
     PRICE_CATEGORY pricecatego2_ 
      on this_.PRICE_CATEGORY=pricecatego2_.PRICE_CATEGORY 
    inner join 
     PRODUCT_CATEGORY productcat3_ 
      on this_.PRODUCT_CATEGORY=productcat3_.PRODUCT_CATEGORY 
    left outer join 
     PENDING_RECORDS pendingrec4_ 
      on this_.PENDING_RECORD_NO=pendingrec4_.PENDING_RECORD_NO 
    where 
     this_.PENDING_RECORD_NO=? 

應該怎樣做,以防止考慮到這些實體的聯接操作,同時更新記錄的實體?因爲這是額外的開銷,並且還生成ClassCastException。我只需要在persit或save時更改關聯實體,而不是在更新或刪除過程中進行更改。

我更新

Servlet.service() for servlet dispatcher threw exception: java.lang.ClassCastException: com.myapps.models.PriceCategory cannot be cast to java.io.Serializable 

期間收到以下錯誤我應該指定CascadeType的?或者我應該使用hibernate CascadeType而不是JPA的,我目前使用PendingRecords?還是有另一種方式?請幫我解決這個問題。

在此先感謝。

+0

是否爲您刪除CascadeType工作? –

+0

@DavePateral如果我錯了,請原諒我,但是當您需要從兩個實體中刪除條目時使用'CascadeType.REMOVE'嗎?它已經在工作。問題出在更新期間,因爲所有實體都在更新,這不是我想要的。我想更新只發生在我調用update()的實體上。同樣如上面的代碼所示,只有一個關聯實體正在使用級聯選項,而其他兩個實體則不是。但是當我調用更新時,hibernate正試圖更新所有4個實體。 – eccentricCoder

+1

該錯誤表明您沒有實現'Serializable'接口。 –

回答

1

我只需要persit期間改變相關的entites或保存 ,而不是更新過程中或刪除

如果,一旦相關實體被設置在堅持的時候,他們不應該被另一個覆蓋實體實例,請使用@JoinColumn(updatable=false)

請注意,由於Hibernate的flush操作順序,它的相關實體並不存在,您可能需要先保存它們,然後刷新EntityManager,然後才保存頂層實體。

在更新記錄實體時應該做些什麼來防止考慮這些實體加入 操作?

嘗試@ManyToOne(fetch=LAZY)。不過,我並不完全確定這將在合併期間起作用,因爲在合併期間Hibernate有很多原因需要獲取相關實體。如果它不起作用,您可能需要編寫自定義更新查詢。

+0

Thankyou。我會嘗試。 – eccentricCoder

+0

在你做之前,確保看到我更新的答案 – crizzis

相關問題