我有一个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?还是有另一种方式?请帮我解决这个问题。
在此先感谢。
是否为您删除CascadeType工作? –
@DavePateral如果我错了,请原谅我,但是当您需要从两个实体中删除条目时使用'CascadeType.REMOVE'吗?它已经在工作。问题出在更新期间,因为所有实体都在更新,这不是我想要的。我想更新只发生在我调用update()的实体上。同样如上面的代码所示,只有一个关联实体正在使用级联选项,而其他两个实体则不是。但是当我调用更新时,hibernate正试图更新所有4个实体。 – eccentricCoder
该错误表明您没有实现'Serializable'接口。 –