2014-12-17 3 views
4

Объект профиля имеет список задач. При сохранении нового профиля список задач также должен быть синхронизирован с базой данных ( вставлен или обновлен). Проблема заключается в файла сохранения() - метод позволяет только тот или иной метод быть в зависимости от свойства каскада, установленного выше атрибута ( CascadeType.PERSIST или MERGE).Spring Data Repository: Отдельный объект, переданный для сохранения

профилей класса

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class AbstractProfile implements Profile { 
    ... 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) 
    private List<Task> tasks; 

    .. 

JUnit Test-класс

public class ProfileTaskRepositoryTest { 

    @Autowired 
    private ProfileRepository profileRepo; //extends JpaRepository 
    @Autowired 
    private TaskRepository taskRepo;   //extends JpaRepository 

    @Test // ->this test passes 
    public void testCreateProfileWithNewTask() { 

     //profileData and taskData hold dummy data. They return new objects 
     AbstractProfile interview = profileData.createITInterviewProfile(); 
     Task questionTask = taskData.createInterviewQuestionTask(); 

     //add new task to profile and save 
     interview.addTask(questionTask); 
     profileRepo.save(interview); 

     //task repository confirms the insertion 
     assertTrue(taskRepo.count() == 1); 
    } 

    @Test // ->this test fails 
    public void testCreateProfileWithExistingTask() { 

     //first create task and save in DB 
     Task questionTask = taskData.createInterviewQuestionTask(); // transient obj 
     taskRepo.save(questionTask); // questionTask becomes detached 

     // then create a new profile and add the existing task. 
     // the problem is the existing task is now detached) 
     AbstractProfile interview = profileData.createITInterviewProfile(); 
     interview.addTask(questionTask); 

     profileRepo.save(interview); // !!! this throws an exception 
    } 

Я полагаю, что questionTask -объект отрывается при taskRepo сохраняет его в БД, а затем закрывает сессию.

Исключение:

org.springframework.orm.jpa.JpaSystemException: org.hibernate.PersistentObjectException: detached entity passed to persist: *.Task; nested exception is javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: *.Task 
... 

profileRepo.save() должен быть в состоянии обрабатывать как вставки и обновление списка задач. Есть ли элегантный способ решить эту проблему?

+0

Что такое 'Task'? Это класс, который вы разработали? Можете ли вы опубликовать этот код? – gaganbm

ответ

0

попытка каскадный = {CascadeType.PERSIST, CascadeType.MERGE}

+1

Я боюсь, что это исключение. –

2

Вы должны поместить @Transactional атрибуты на тестовом классе, чтобы избежать исключения.

@Transactional 
@TransactionConfiguration 
public class ProfileTaskRepositoryTest { 
} 

Надеюсь, это поможет.

+0

Это не обязательно для тестового класса. Он должен быть добавлен в TaskRepository, который фактически расширяет JpaRepository. – gaganbm

+1

В вопросе описано, что ProfileRepository и TaskRepository простирается от JpaRepository, который является интерфейсом. Если бы это был тот случай, когда CreateProfileWithExistingTask был методом класса обслуживания, тогда атрибуты @Transactional должны были быть в классе службы, и нет необходимости помещать их в тестовый класс, если у вас нет требования для запуска тестов в транзакции. –

0

Срок действия гибернации истек;

Использование

spring.datasource.removeAbandoned=false 

или

spring.datasource.removeAbandonedTimeout=... 
Смежные вопросы