【问题标题】:hibernate foreign key is updating all fields in ref table休眠外键正在更新参考表中的所有字段
【发布时间】:2025-12-05 09:15:01
【问题描述】:

我是这个论坛的新手并且正在休眠。我遇到了休眠多对一映射问题。

@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name = "DTE_ID")
@NotNull
private Dte raisedByDte;

这是我在主对象中使用的代码,外键是DTE_ID。但是当我试图保存它时,它会更新引用表中的所有字段。我的参考对象如下:

@Entity
@Table(name = "DTE_MASTERS",  uniqueConstraints = @UniqueConstraint(columnNames = "DTE_NAME"))
public class Dte {

   @Id  
   @Column(name="DTE_ID", updatable = false, nullable = false)
   private int dte_id;
   @Column(name="DTE_NAME")
   private String dte_name;

   public Dte() {
      super();
      // TODO Auto-generated constructor stub
   }
   public Dte(int dte_id, String dte_name) {
      super();
      this.dte_id = dte_id;
      this.dte_name = dte_name;
   }
   public int getDte_id() {
      return dte_id;
   }
   public void setDte_id(int dte_id) {
      this.dte_id = dte_id;
   }
   public String getDte_name() {
      return dte_name;
   }
   public void setDte_name(String dte_name) {
      this.dte_name = dte_name;
   }

我想在插入时限制DTE_MASTERS 的更新..可以请一些人指导我吗?

【问题讨论】:

    标签: java hibernate jpa one-to-many many-to-one


    【解决方案1】:

    您必须从映射中删除级联选项。它强制执行与对父对象执行的操作相同的操作。 我猜你正在对主对象执行merge() .. 并且使用该选项,merge()(如果实体不是新实体将导致更新)也将在 Dte 依赖项上调用:

    @ManyToOne(fetch = FetchType.EAGER)
    

    另外,请记住,如果您在 Dte 实体中的任何非瞬态字段在加载主实体后,所有更改都将在事务结束时隐式提交。

    为了防止您需要执行session.evict(dte);,以便任何更改都不会保留在数据库中,即使它们是在事务方法中执行的。

    【讨论】:

    • 感谢您的快速帮助,您能否解释一下,请记住,如果您在 Dte 实体中的任何非瞬态字段一旦加载主实体,所有更改都将隐含在交易结束。为了防止您需要执行 session.detach(dte);这样任何更改都不会保留在数据库中,即使它们是在事务方法中执行的。
    • so.. 一旦您在事务中检索实体,它就在持久性上下文中,直到事务结束(除非您调用 evict)。现在,您对该对象状态所做的任何更改.. 都将刷新到数据库中.. 无论您是否使用了 update / saveOrUpdate
    • 当然@Maciej Kowalski。感谢您的快速响应和指导