2016-11-10 5 views
0

я застрял со следующей проблемой: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)

+0

Показать подробную информацию; Включите ведение журнала EclipseLink, чтобы увидеть SQL, который был сгенерирован, и попробуйте вызвать em.flush после вашего вызова persist. Почему вы используете getReference вместо поиска? Предположительно, если condominio является частью PK Bloco, он действительно должен существовать, прежде чем вы сможете создать Condominio с помощью этого кода. Единственная причина, по которой EclipseLink попытается вставить экземпляр condominio, это если он найдет тот, который не управляется EntityManager, на который ссылается что-то, что есть. Убедитесь, что этот EM не содержит чего-то другого ранее, чего он не должен. – Chris

+0

Это может помочь, если вы можете отключить проверку ограничений до конца транзакции, так как это позволит вам видеть все выдаваемые инструкции. Это может сделать более очевидным, почему эта вставка происходит, но вам придется отследить вашу модель, чтобы увидеть, где есть экземпляр Condominio с нулевым номинантным значением. – Chris

ответ

0

Вот дие правильный метод, я не установить CONDOMINIO в BLOCO, поэтому, когда я попытался создать новый BLOCO оно не имеет CONDOMINIO.

Я новичок в подобных вещах, иногда совершаю такие ошибки, но спасибо за помощь.

================================================================================================================================== ====================

@RequestMapping (значение = "cadbloco", метод = RequestMethod.POST) общественного Строка cadbloco (@ModelAttribute (значение = " Bloco ") Bloco bloco, @RequestParam (" condid ") int idcond) throws Exception {

BlocoJpaController jpa = new BlocoJpaController(); 
    Condominio c = new Condominio(); 
    c.setIdcondominio(idcond); 
    bloco.setCondominio(c); 
    jpa.create(bloco); 

    return ("redirect:bloco.htm"); 

} 
0

Исключение означает, что значение «nomecond» равно null. Поэтому в вашем контроллере, если вы добавите код, который говорит

c.setNomeCond («Некоторое значение»);

Это должно решить проблему.,

+0

Я пытаюсь вставить в «bloco» с уже созданным «кондоминиумом», и не создавая знакомого кондоминиума, это отношение «один ко многим», –

+0

, тогда вам придется установить объект Condominio в Bloco., Bloco.setCondominio (с); –

+0

, который отсутствовал, но он все еще пытается вставить в таблицу condominio, я думаю, что это как-то заставлять двунаправленную связь .... –