Eclipselink 和 eclipselink 尝试插入父 table,
Eclipselink with eclipselink tries insert in the parent table,
我遇到了以下问题:
每次我尝试创建一个 bloco 时,eclipselink 都会尝试插入一个 condominio 记录(应该为空),当我 运行 在一个简单的 java 项目中使用相同的代码(没有 spring) 它工作正常,但在 Web 项目中它一直试图插入 "parent" table.
eclipselink 试图强制双向关系的任何原因?
实体
公寓
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idcondominio")
private Integer idcondominio;
@Basic(optional = false)
@Column(name = "nomecond")
private String nomecond;
@Column(name = "cnpjcond")
private Integer cnpjcond;
@OneToMany(mappedBy = "condominio")
private Collection<Bloco> blocoCollection;
布洛科
private static final long serialVersionUID = 1L;
@EmbeddedId
protected BlocoPK blocoPK;
@Basic(optional = false)
@Column(name = "nomebloco")
private String nomebloco;
@Column(name = "numero")
private String numero;
@JoinColumn(name = "condominio_idcondominio", referencedColumnName = "idcondominio", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Condominio condominio;
==============================
创建方法
public void create(Bloco bloco) throws PreexistingEntityException, Exception {
if (bloco.getBlocoPK() == null) {
bloco.setBlocoPK(new BlocoPK());
}
bloco.getBlocoPK().setCondominioIdcondominio(bloco.getCondominio().getIdcondominio());
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
Condominio condominio = bloco.getCondominio();
if (condominio != null) {
condominio = em.getReference(condominio.getClass(), condominio.getIdcondominio());
bloco.setCondominio(condominio);
}
em.persist(bloco);
if (condominio != null) {
condominio.getBlocoCollection().add(bloco);
condominio = em.merge(condominio);
}
em.getTransaction().commit();
} catch (Exception ex) {
if (findBloco(bloco.getBlocoPK()) != null) {
throw new PreexistingEntityException("Bloco " + bloco + " already exists.", ex);
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
=========================
控制器方法
@RequestMapping(value = "cadbloco", method = RequestMethod.POST)
public String cadbloco(@ModelAttribute(value = "Bloco") Bloco bloco, @RequestParam("condid") int idcond ) throws Exception {
BlocoJpaController jpa = new BlocoJpaController();
Condominio c = new Condominio();
c.setIdcondominio(idcond);
jpa.create(bloco);
return ("redirect:bloco.htm");
}
=====================
类型异常报告
消息请求处理失败;嵌套异常是 javax.persistence.RollbackException: 异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
说明服务器遇到内部错误,无法完成此请求。
异常
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列 'nomecond' 不能为空
错误代码:1048
调用:INSERT INTO condominio (cnpjcond, nomecond) VALUES (?, ?)
绑定 => [绑定 2 个参数]
查询:InsertObjectQuery(Entity.Condominio[ idcondominio=null ])
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
异常显示 "nomecond" 值为空。所以在你的控制器中,如果你添加说
的代码
c.setNomeCond("Some value");
这应该可以解决问题。,
这是正确的方法,我没有在 bloco 中设置 condominio,所以当我尝试创建一个新的 bloco 时它没有 condominio。
我刚接触这类东西,有时会犯这些错误,但感谢您的帮助。
============================================= =====================
@RequestMapping(值="cadbloco",方法=RequestMethod.POST)
public String cadbloco(@ModelAttribute(value = "Bloco") Bloco bloco, @RequestParam("condid") int idcond) 抛出异常{
BlocoJpaController jpa = new BlocoJpaController();
Condominio c = new Condominio();
c.setIdcondominio(idcond);
bloco.setCondominio(c);
jpa.create(bloco);
return ("redirect:bloco.htm");
}
我遇到了以下问题:
每次我尝试创建一个 bloco 时,eclipselink 都会尝试插入一个 condominio 记录(应该为空),当我 运行 在一个简单的 java 项目中使用相同的代码(没有 spring) 它工作正常,但在 Web 项目中它一直试图插入 "parent" table.
eclipselink 试图强制双向关系的任何原因?
实体
公寓
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idcondominio")
private Integer idcondominio;
@Basic(optional = false)
@Column(name = "nomecond")
private String nomecond;
@Column(name = "cnpjcond")
private Integer cnpjcond;
@OneToMany(mappedBy = "condominio")
private Collection<Bloco> blocoCollection;
布洛科
private static final long serialVersionUID = 1L;
@EmbeddedId
protected BlocoPK blocoPK;
@Basic(optional = false)
@Column(name = "nomebloco")
private String nomebloco;
@Column(name = "numero")
private String numero;
@JoinColumn(name = "condominio_idcondominio", referencedColumnName = "idcondominio", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Condominio condominio;
============================== 创建方法
public void create(Bloco bloco) throws PreexistingEntityException, Exception {
if (bloco.getBlocoPK() == null) {
bloco.setBlocoPK(new BlocoPK());
}
bloco.getBlocoPK().setCondominioIdcondominio(bloco.getCondominio().getIdcondominio());
EntityManager em = null;
try {
em = getEntityManager();
em.getTransaction().begin();
Condominio condominio = bloco.getCondominio();
if (condominio != null) {
condominio = em.getReference(condominio.getClass(), condominio.getIdcondominio());
bloco.setCondominio(condominio);
}
em.persist(bloco);
if (condominio != null) {
condominio.getBlocoCollection().add(bloco);
condominio = em.merge(condominio);
}
em.getTransaction().commit();
} catch (Exception ex) {
if (findBloco(bloco.getBlocoPK()) != null) {
throw new PreexistingEntityException("Bloco " + bloco + " already exists.", ex);
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
========================= 控制器方法
@RequestMapping(value = "cadbloco", method = RequestMethod.POST)
public String cadbloco(@ModelAttribute(value = "Bloco") Bloco bloco, @RequestParam("condid") int idcond ) throws Exception {
BlocoJpaController jpa = new BlocoJpaController();
Condominio c = new Condominio();
c.setIdcondominio(idcond);
jpa.create(bloco);
return ("redirect:bloco.htm");
}
=====================
类型异常报告
消息请求处理失败;嵌套异常是 javax.persistence.RollbackException: 异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
说明服务器遇到内部错误,无法完成此请求。
异常
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列 'nomecond' 不能为空 错误代码:1048 调用:INSERT INTO condominio (cnpjcond, nomecond) VALUES (?, ?) 绑定 => [绑定 2 个参数] 查询:InsertObjectQuery(Entity.Condominio[ idcondominio=null ]) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
异常显示 "nomecond" 值为空。所以在你的控制器中,如果你添加说
的代码c.setNomeCond("Some value");
这应该可以解决问题。,
这是正确的方法,我没有在 bloco 中设置 condominio,所以当我尝试创建一个新的 bloco 时它没有 condominio。
我刚接触这类东西,有时会犯这些错误,但感谢您的帮助。
============================================= =====================
@RequestMapping(值="cadbloco",方法=RequestMethod.POST) public String cadbloco(@ModelAttribute(value = "Bloco") Bloco bloco, @RequestParam("condid") int idcond) 抛出异常{
BlocoJpaController jpa = new BlocoJpaController();
Condominio c = new Condominio();
c.setIdcondominio(idcond);
bloco.setCondominio(c);
jpa.create(bloco);
return ("redirect:bloco.htm");
}