2017-06-19 64 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

相关问题