hibernate双向@onetomanyMap返回列“”不能为空

zlwx9yxi  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(340)

我对休眠有问题 @OneToMany Map。这是我的根实体:

@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

save称之为

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 . 你对如何解决这个问题有什么建议吗?

3wabscal

3wabscal1#

标记为id的列“cod\u proposta”和“cod\u fondo\u ue\u ul”不能为null,并且您不会为该属性赋予任何值(除非在创建对象后手动执行)。要自动提供id,可以添加注解 @GeneratedValuecodProposta 以及 codFondoUeUl .

piwo6bdm

piwo6bdm2#

如文件所述:
每当形成双向关联时,应用程序开发人员必须确保双方始终同步。
所以你应该加上 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();

相关问题