Моя среда
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 ............
}
}