代码之家  ›  专栏  ›  技术社区  ›  cvdr

防止级联插入JPA

  •  0
  • cvdr  · 技术社区  · 7 年前

    public class Order{
    
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      Long id;
    
      @ManyToOne(fetch = FetchType.LAZY)
      Status status;
    
    }
    
    public class Status{
    
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      Long id;
    
      String description;
    
    }
    

    当我调用Spring的JPARepository来保存订单时,jpa试图保存一个新的状态行,但实际上我只想保存订单和状态之间的关系。

    例外情况:

    "org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
    

    “订单”表具有ID(主键)、状态ID(FK) “状态”表具有ID(主键)、说明

    3 回复  |  直到 7 年前
        1
  •  2
  •   JimmyB    7 年前

    可以指定要在关系注释中级联的操作,请参见 cascade() 喜欢

    @ManyToOne(fetch=..., cascade={CascadeType.DETACH,CascadeType.REFRESH})

    请注意,我们指定 哪一个 级联其他操作。

        2
  •  0
  •   marc_s MisterSmith    7 年前

    如果status可以有多个订单,那么您应该将关联控件移动到status类,并在其中创建带有oneToMany注释的订单列表。此外,最好使用双向关联,而不是单向关联。总之,在您的情况下,正确的映射如下所示:

    public class Order{
    
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      Long id;
    
      @ManyToOne(fetch = FetchType.LAZY)
      Status status;
    }
    
    
    public class Status{
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        Long id;
    
        String description;
    
        @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="status")
        List<Order> orders;
    }
    
        3
  •  -2
  •   Payal Bansal    7 年前