Создание сущности, связанной с другими сущностями

 
 
 
Сообщения:10
Здравствуйте. Есть сущность:
package com.igorgorbunov3333.core.entities.domain;

import javax.persistence.*;

/**
 * Created by Игорь on 03.04.2016.
 */

@Entity
@Table(name = "cases")
@NamedQueries({
    @NamedQuery(name = "findAllCases", query = "SELECT c FROM Case c"),

    @NamedQuery(name = "findCasesWithJudge", query = "SELECT c FROM Case c " +
            "WHERE c.firstInstance.judge.id = :id OR c.secondInstance.judge.id = :id OR c.thirdInstance.judge.id = :id")
})
public class Case {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "case_number")
    private String caseNumber;

    @Column(name = "client")
    private String clientName;

    @OneToOne
    @JoinColumn(name = "first_instance_id")
    private FirstInstance firstInstance;

    @OneToOne
    @JoinColumn(name = "second_instance_id")
    private SecondInstance secondInstance;

    @OneToOne
    @JoinColumn(name = "third_instance_id")
    private ThirdInstance thirdInstance;

    @ManyToOne
    @JoinColumn(name = "category_id")
    private Category category;

    private float price;
}

Как видите, она связана с другими сущностями. Проблема в том, что у меня не получается сохранить сущность. Вот сервлет:
package com.igorgorbunov3333.web.servlet.create;

import com.igorgorbunov3333.core.entities.domain.*;
import com.igorgorbunov3333.core.entities.service.api.*;
import com.igorgorbunov3333.core.util.DateUtil;
import com.igorgorbunov3333.core.util.SpringAppContextManager;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * Created by Игорь on 03.12.2016.
 */
@WebServlet(name = "DoCreateCase", urlPatterns = "/doCreateCase")
public class DoCreateCase extends HttpServlet {
    private final CategoryService categoryService = SpringAppContextManager.getAppContext()
            .getBean("CategoryService", CategoryService.class);

    private final JudgeService judgeService = SpringAppContextManager.getAppContext()
            .getBean("JudgeService", JudgeService.class);

    private final LawyerService lawyerService = SpringAppContextManager.getAppContext()
            .getBean("LawyerService", LawyerService.class);

    private final FirstInstanceService firstInstanceService = SpringAppContextManager.getAppContext()
            .getBean("FirstInstanceService", FirstInstanceService.class);

    private final CaseService caseService = SpringAppContextManager.getAppContext()
            .getBean("CaseService", CaseService.class);

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Case lawsuit = new Case();
        FirstInstance firstInstance = new FirstInstance();

        String caseNumber = request.getParameter("case-number");
        lawsuit.setCaseNumber(caseNumber);

        String clientName = request.getParameter("client-name");
        lawsuit.setClientName(clientName);

        String dayOpen = request.getParameter("day-open"),
               monthOpen = request.getParameter("month-open"),
               yearOpen = request.getParameter("year-open");
        Date date = DateUtil.toDate(yearOpen, monthOpen, dayOpen);
        firstInstance.setDate(date);

        long categoryId = Long.valueOf(request.getParameter("category"));

        Category category = categoryService.findById(categoryId);
        lawsuit.setCategory(category);

        float price = Float.valueOf(request.getParameter("price"));
        lawsuit.setPrice(price);

        long judgeId = Long.valueOf(request.getParameter("judge"));
        Judge judge = judgeService.findById(judgeId);
        firstInstance.setJudge(judge);

        long lawyerId = Long.valueOf(request.getParameter("lawyer"));
        Lawyer lawyer = lawyerService.findById(lawyerId);
        firstInstance.setLawyer(lawyer);

        lawsuit.setFirstInstance(firstInstance);
        caseService.create(lawsuit, firstInstance, new SecondInstance(), new ThirdInstance(), category);
    }
}

Вот метод, который персистит сущность:
@Transactional
    public Case create(Case lawsuit, FirstInstance firstInstance,
                       SecondInstance secondInstance, ThirdInstance thirdInstance,
                       Category category) {
        entityManager.persist(firstInstance);
        entityManager.persist(secondInstance);
        entityManager.persist(thirdInstance);
        entityManager.persist(category);
        entityManager.persist(lawsuit);
        return lawsuit;
    }

Вылазит:
Quote:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'

Подскажите как правильно сохранять подобные сущности? Использую Spring + JPA + Hibernate
 
 
Сообщения:9474
Твоя проблема похоже в том что ты достаешь из БД свои сущности (которые по сути уже сохранены), но ты им пытаешься снова сделать persist(). Поэтому либо не делай лишние persist(), либо используй merge() раз не знаешь сохранена она уже или нет. Ну или переходи на голый Hibernate - там есть метод saveOrUpdate().
 
 
Сообщения:10
Лишние персисты убрал, проблема теперь другая. Сущность FirstInstance имеет id = 35, но в поле FirstInstance сущности Case значение равно 0, а должно равнятся 35...
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет