簡體   English   中英

Hibernate 雙向@OneToMany 映射返回列 'xxx' 不能為 null

[英]Hibernate bidirectional @OneToMany mapping return Column 'xxx' cannot be null

我對 Hibernate 雙向@OneToMany映射有疑問。 這是我的根實體:

@Entity(name = "Proposta")
@Table(name = "PROPOSTA")
public class Proposta implements Serializable {
        
   private static final long serialVersionUID = -705828064150128352L;
        
   public Proposta() {
       super();
   }
            
   @Id
   @Column(name = "COD_PROPOSTA")
   private Integer codProposta; 
            
   @OneToMany(mappedBy="proposta", fetch=FetchType.EAGER)
   @Cascade({ CascadeType.ALL })
   private List<PropostaUL> listaPropostaUl;

}

這是我的子實體:

@Entity(name = "PropostaUL")
@Table(name = "PROPOSTA_UL")
public class PropostaUL {
        
   public PropostaUL() {
      super();
   }
    
   @Id
   @Column(name = "COD_FONDO_UE_UL")
   private String codFondoUeUl; 
        
   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "COD_PROPOSTA")
   private Proposta proposta;

}

當我讀取這兩個表的值時,一切正常; 當我嘗試保存它時,出現以下錯誤

gen 05, 2021 10:14:03 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1048, SQLState: 23000
gen 05, 2021 10:14:03 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Column 'COD_PROPOSTA' cannot be null
gen 05, 2021 10:14:03 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements

保存調用它如下

protected Object saveOrUpdate(Object obj, List<String> errorLog) {
   Transaction transaction = null;
   try {
      if (session == null || ! session.isOpen()) {
         session = HibernateFactory.getSessionFactory().openSession();
      } 
      transaction = session.beginTransaction();
      session.saveOrUpdate(obj);
      transaction.commit();
   } catch (HibernateException e) {
      obj = null;
      errorLog.add(e.getMessage());
   } finally {
      if (session != null) {
         session.close();
      } 
   }
   return obj;
}

我在論壇中閱讀了其他相同的問題,但建議的所有解決方案都不起作用。 我也檢查了這個網站

https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

即使分析的案例看起來相同,配置也一樣,問題仍然存在。 提供了根實體中COD_PROPOSTA的值,它不是null 你對如何解決這個問題有什么建議嗎?

標記為 Id 的“COD_PROPOSTA”和“COD_FONDO_UE_UL”列不能是 null,並且您沒有為該屬性提供任何值(除非您在創建對象后手動執行此操作)。 要自動提供 Id,您可以將注釋@GeneratedValue添加到codPropostacodFondoUeUl

正如文檔中所述:

每當形成雙向關聯時,應用程序開發人員必須確保雙方始終保持同步。

因此,您應該添加addPropostaUl()removePropostaUl()實用程序方法,以便在添加或刪除子元素時同步兩端:

@Entity
public class Proposta implements Serializable {
    
   // ...
        
   @OneToMany(mappedBy = "proposta", fetch = FetchType.EAGER)
   @Cascade(CascadeType.ALL)
   private List<PropostaUL> listaPropostaUl;
 
   public void addPropostaUl(PropostaUL propostaUl) {
      listaPropostaUl.add(propostaUl);
      propostaUl.setProposta(this);
   }

   public void removePropostaUl(PropostaUL propostaUl) {
      listaPropostaUl.remove(propostaUl);
      propostaUl.setProposta(null);
   }
}

然后在要修改此關聯時僅使用這些方法。

示例(將新的PropostaUL添加到現有的Proposta ):

Transaction transaction = session.beginTransaction();

Proposta proposta = session.load(Proposta.class, propostaId);
PropostaUL newPropostaUL = new PropostaUL();
// ...
proposta.addPropostaUl(newPropostaUL);
session.saveOrUpdate(proposta);

transaction.commit();

謝謝大家的回答。
我發現了問題。
The object that I have to save is json object converted in Java object via Jackson library.
所以我在對象中添加了@JsonManagedReference 和@JsonBackReference 並且它可以工作。
這是正確的代碼

@Entity(name = "Proposta")
@Table(name = "PROPOSTA")
public class Proposta implements Serializable {
        
   private static final long serialVersionUID = -705828064150128352L;
        
   public Proposta() {
       super();
   }
            
   @Id
   @Column(name = "COD_PROPOSTA")
   private Integer codProposta; 
            
   @JsonManagedReference
   @OneToMany(mappedBy="proposta", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
   private List<PropostaUL> listaPropostaUl;

}

和 PropostaUL object

@Entity()
@Table(name = "PROPOSTA_UL")
public class PropostaUL {
    
    public PropostaUL() {
        super();
    }

    @Id
    @Column(name = "COD_FONDO_UE_UL")
    private String codFondoUeUl;    
    
    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "COD_PROPOSTA")
    private Proposta proposta;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM