У меня странная проблема.У меня есть несколько записей в базе данных:
Компания
- id = 1, Имя = Microsoft
- id = 2, Имя = Sun
Теперь у меня есть другая сущность, Event, которая ссылается на Company по внешнему ключу:
@Entity
public class Event {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private Company company;
}
На уровне своего веб-сервиса я создаю событие, используя идентификатор компании, переданный в качестве параметра URL:
@GET
@Path("addEvent")
public String addEvent(@QueryParam("cid") long companyId) {
Company alreadyInDB = new Company();
alreadyInDB.setId(companyId);
Event event = new Event();
event.setCompany(alreadyInDB);
eventService.addEvent(event);
}
Это, чем вызывает EventService.Я изначально использовал закомментированную строку кода.Но когда это не удалось из-за ошибки ограничения внешнего ключа, я добавил код, чтобы убедиться, что запись о компании существует.Конечно же, код печатает правильный идентификатор.Но он все равно не работает с нарушением ограничения внешнего ключа.
@Service("eventService")
public class EventService {
@Autowired
EventDAO eventDAO;
@Autowired
CompanyDAO companyDAO;
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public void addEvent(Event event) throws Exception
{
System.out.println("Company ID: " + event.getCompany().getId());
Company ensureRecordExists = companyDAO.findById(event.getCompany().getId());
System.out.println("ensureRecordExists: " + ensureRecordExists.getId());
event.setCompany(ensureRecordExists);
//event.setCompany(companyDAO.getReferenceById(event.getCompany().getId()));
eventDAO.persist(event);
}
}
Вот соответствующая часть трассировки стека:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`blah`.`event`, CONSTRAINT `FKE7E9BF09F9DCA789` FOREIGN KEY (`company_id`) REFERENCES `Company` (`id`))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
Есть идеи, что происходит?Я физически вижу, что запись существует в MySQL Workbench.Я понятия не имею, почему это терпит неудачу.Я думал, что это может быть связано с очисткой сессии или какой-то транзакционной проблемой ...?Но я вижу запись ...