[英]Getting null in mapping column in Hibernate bidirectional ManytoOne , OnetoMany
[英]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
添加到codProposta
和codFondoUeUl
。
正如文檔中所述:
每當形成雙向關聯時,應用程序開發人員必須確保雙方始終保持同步。
因此,您應該添加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.