Вызов метода отсоединения не удаляет сущность из контекста постоянства. - PullRequest
0 голосов
/ 10 июля 2019

Моя среда

Java 8 / Spring Data JPA 2.0.5 / JPA 2.1 / Eclipse Link 2.6.4 / JBoss EAP 7.1 *

Мой сценарий

У меня есть три объекта (@Entity): папка, конфигурация и документ.

У меня есть три репозитория (@Repository): FolderRepository, ConfigurationRepository и DocumentRepository.

У меня есть одна служба (@Service): TestService.

Транзакционность определяется только в методах TestService.

Моя проблема

Если мы выполним 'test 'метод, код попытайтесь сохранить сущность' Folder 'в базе данных:

  • Если сущность не существует в базе данных, она сохраняется, и вызов documentRepository.findById работает правильно.
  • Если объект уже существует в базе данных, генерируется исключение PersistenceException.Мы ловим исключение и отсоединяем сущность.Когда мы вызываем «documentRepository.findById», генерируется исключение SQLIntegrityConstraintViolationException.Почему?

Я не понимаю, почему это исключение выдается, если мы отсоединили сущность.Эта сущность не должна находиться в контексте постоянства.

Мой код

@Service
public class TestServiceImpl implements TestService
{
    @Autowired
    private FolderRepository folderRepository;

    @Autowired
    private ConfigurationRepository configurationRepository;

    @Autowired
    private DocumentRepository documentRepository;

    @PersistenceContext
    private EntityManager em;

    @Override
    @Transactional(readOnly = false)
    public void test(String documentCode)
    {
        List<Configuration> configuration = configurationRepository.findAll();          

        DateFormat dateFormat = new SimpleDateFormat("yyyyMM");
        Date date = new Date();
        String folderName = dateFormat.format(date)

        Folder folder = new Folder ();          
        folder.setName (folderName);  //Primary key
        folder.setDateCreation (date);

        // We try to persist 'folder' entity using an EntityManager instance. 
        // We don't use 'saveAndFlush' because we don't want a merge happens.
        // If constraint exception is thrown, we detach the 'folder' entity
        try
        {           
            em.persist(folder);
            em.flush();
        }
        catch (PersistenceException e)
        {
            em.detach(folder);
        }

        // Why is a SQLIntegrityConstraintViolationException thrown here?
        folder = documentRepository.findById (documentCode);

        ............ more code ............
    }
}
...