JPA / hibernate - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется - НО запись существует - PullRequest
2 голосов
/ 27 июня 2011

У меня странная проблема.У меня есть несколько записей в базе данных:

Компания

  • 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.Я понятия не имею, почему это терпит неудачу.Я думал, что это может быть связано с очисткой сессии или какой-то транзакционной проблемой ...?Но я вижу запись ...

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Вы должны упомянуть @JoinColumn

@ManyToOne
@JoinColumn(name = "company_id")
private Company company;

Это ответственно за создание company_id в таблице событий.

2 голосов
/ 27 июня 2011

Я сузил проблему и разместил еще один вопрос здесь:

JPA / Hibernate - имя объекта представляется важным. Если я переименую в «Боб», то все отлично работает

Я нашел решение здесь:

http://developmentality.wordpress.com/2011/05/23/hibernate-mysql-mac-foreign-key-nightmares-a-painless-solution-to-a-painful-problem/

Из-за сочетания mysql, hibernate и mac os x существует некоторая проблема, когда вам нужно использовать стратегию именования в нижнем регистре в hibernate. В спящем режиме по умолчанию используется стратегия присвоения имен верблюдам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...