当前位置: 首页 > 知识库问答 >
问题:

当在具有多个@ManyToOne关联的实体上使用hibernate update()时,如何限制关联表被考虑加入

季博
2023-03-14

我有一个记录实体,它与Product_Category表和Price_Category表保持@ManyToOne关系。记录实体还维护与另一个名为 PendingRecords 的表的@OneToMany关联。

目前,这对于hibernate save/persist非常有效,在这种情况下,当满足特定条件时,所有相关的表也会被修改。问题是这些关联的实体也在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)

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

以下是相关的表格

< code>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",parameters=@Parameter(name="property", value="record"))
private Long pending_record_id;

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

@OneToOne
@PrimaryKeyJoinColumn
private Record record;

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

(getters-setters)

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

当我执行插入(hibernate persist/save)时,实体关联工作正常。问题是,当我尝试更新记录时,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=?

在更新记录实体时,应如何防止将这些实体视为联接操作?因为这是一个额外的开销,并且还会生成<code>ClassCastException。我需要关联的实体只在persit或save期间更改,而不是在update或delete期间更改。

我在更新过程中遇到以下错误

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

我应该指定CascadeType吗?或者我应该使用hibernate CascadeType而不是我目前用于PendingRecords的JPA?或者有其他方法吗?请帮我解决这个问题。

提前感谢。

共有1个答案

姚乐家
2023-03-14

我需要关联的实体仅在浏览或保存期间更改,而不是在更新或删除期间更改

如果在持久时间设置相关实体后,永远不应用另一个实体实例覆盖它们,请使用@JoinColumn(updatable=false)

请注意,由于Hibernate的刷新操作顺序,如果相关实体不存在,您可能需要先保存它们,刷新EntityManager,然后才保存顶级实体。

在更新记录实体时,应如何防止将这些实体视为联接操作?

试试< code > @ many toone(fetch = LAZY)。不过,我不完全确定这在合并期间是否可行,因为Hibernate在合并期间获取相关实体有很多原因。如果它不起作用,您可能需要编写一个定制的更新查询。

 类似资料:
  • 假设我在前面有一个表单,它有常用的字段和下拉列表。在这些下拉列表中,用户可以选择一个选项,并且每个选项都链接到Spring data JPA中的一个实体; 下拉列表包含一些标签和对应实体的链接作为值。然后,这个值在POST-request中传递给我们希望创建的实体的PagingAndSorting存储库。 假设它是一个具有username的用户,并且他必须与其中一个办公室(也是一个实体)关联: 我

  • 问题内容: 我将分页与hibernate的spring-data-jpa和querydsl一起使用,并且我只用于一次往返数据库。 和: 我的查询 但是在日志中有很多往返数据库的行程: 问题答案: 该两个有道理 和 以及 以防万一,我们必须在级别上应用它(在我们的类映射中) 在doc中检查它 ( 在 下面附加小引用) : [20.1.5。使用批量提取](http://docs.jboss.org/h

  • 本文向大家介绍Yii2 ActiveRecord多表关联及多表关联搜索的实现,包括了Yii2 ActiveRecord多表关联及多表关联搜索的实现的使用技巧和注意事项,需要的朋友参考一下 Yii的ActiveRecord是与数据库打交道的类,也即MVC中的M(模型层),也是ORM的O(Object)。 一个老生常谈的问题。最近通过群里的反馈,觉得很多人还是没有去理解这个问题。今天把这个问题讲明白了

  • 我正在尝试使用一个不是很简单的关联表在两个JPA实体之间进行ManyTo许多连接。我想知道是否有一种方法可以在不创建关联表实体的情况下实现这一点(类似于使用@JoinTable)。 表A-ID(PK) -名称 表b -ID(PK) -名称 TableMapping-ID(PK) -Parent\u ID(FK)-- 映射以我上面描述的方式存储,原因我不知道,也无法更改。很多地方都在这样使用它,我必

  • 问题内容: 我这样做是为了对实体对象进行延迟加载: 我想与多个延迟加载的集合返回一个实体对象 加载的 ,我能做到这一点(通过在列表中,并设置超过联想单个标准是什么?): 问题答案: 是? 该文档包含以下内容: 该查询将通过外部联接获取伴侣和小猫。有关更多信息,请参见第20.1节“获取策略”。

  • 这是我的pb。 我有一个实体游戏和一个实体控制台 这是一个多个关联。 为了提高性能,我在同一查询中加载游戏和控制台,如下所示: 当我使用