я застрял со следующей проблемой:EclipseLink с EclipseLink пытается вставить в родительской таблице,
каждый раз, когда я пытаюсь создать BLOCO, EclipseLink пытается вставить CONDOMINIO запись (которая должна быть пустой), когда я бегу тот же код в простом проекте java (без весны) работает отлично, но в веб-проекте он пытается вставить в «родительскую» таблицу.
любая причина, по которой eclipselink пытается заставить двунаправленные отношения?
Сущности
Condominio
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;
Bloco
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, послесвечение услуги - 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) ЗНАЧЕНИЯ привязывать => [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)
Показать подробную информацию; Включите ведение журнала EclipseLink, чтобы увидеть SQL, который был сгенерирован, и попробуйте вызвать em.flush после вашего вызова persist. Почему вы используете getReference вместо поиска? Предположительно, если condominio является частью PK Bloco, он действительно должен существовать, прежде чем вы сможете создать Condominio с помощью этого кода. Единственная причина, по которой EclipseLink попытается вставить экземпляр condominio, это если он найдет тот, который не управляется EntityManager, на который ссылается что-то, что есть. Убедитесь, что этот EM не содержит чего-то другого ранее, чего он не должен. – Chris
Это может помочь, если вы можете отключить проверку ограничений до конца транзакции, так как это позволит вам видеть все выдаваемые инструкции. Это может сделать более очевидным, почему эта вставка происходит, но вам придется отследить вашу модель, чтобы увидеть, где есть экземпляр Condominio с нулевым номинантным значением. – Chris