Restful Web Services - поддержка внешних ключей - PullRequest
1 голос
/ 06 декабря 2011

Я неправильно понимаю основную концепцию веб-служб Restful? У меня есть приложение для Android, которое я пытаюсь использовать Restful PUT. Две таблицы Mysql Country и StateProvince с указанием countryId внешнего ключа в таблице StateProvince.

Если я попытаюсь сделать PUT для StateProvince с помощью следующего

<StateProvince><stateName>Victoria</stateName><countryId>1</countryId></StateProvince>

Я получаю ошибку ниже. Я неправильно понимаю основную концепцию, касающуюся внешних ключей и отдыха?

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseExcepti on
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Column 'country_id' cannot be null
Error Code: 1048
Call: INSERT INTO state_province (state_id, state_name, country_id) VALUES (?, ?, ?)
bind => [3 parameters bound]
Query: InsertObjectQuery(com.pezoot.models.StateProvince[ stateId=2 ])

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Краткий ответ: country_id имеет значение null, поэтому это похоже на проблему с базой данных / постоянством. Возможно, вы не установили страну для StateProvince (или не добавили StateProvince в страну - вы не видели ваш код, поэтому я не знаю, как вы отображаете данные).

Длинный ответ:

Почему идентификатор базы данных входит в ваш HTTP-запрос?

Вам нужно начать думать с точки зрения URI и ресурсов - ваше представление StateProvince должно иметь какую-то ссылку , которая относится к стране по определенному URI (например, <link rel="country" href="/country/1" /> и в вашем классе ресурсов, которые Обрабатывает глагол PUT, вам нужно иметь возможность преобразовать этот URI в объект домена, сущность (как кажется, вы используете EclipseLink), которую вы можете использовать с помощью какого-либо метода установки или чего-то еще для установления отношения с базой данных. Отношения REST и отношения с базой данных принципиально различны.

Требуется практика и тщательное размышление, чтобы справиться с тем, что кажется простой концепцией (HTTP verbage) с вашей единицей персистентности. Что-то, что кажется простым, например PUT, требует нетривиальной обработки, чтобы заставить его работать так, как ожидал бы REST.

Соблазнительно использовать идентификаторы базы данных в URI, потому что это легко (особенно если вы используете подресурсы, которые просто волшебным образом знают, кто их родитель: например, страна / 1 / stateprovince / 2), но вы должны отступить и спросить Вы сами, это страна / 1 или страна / США - вы также должны спросить себя, действительно ли страна и штат / провинция - это субъект? или это просто объект значения? Вы действительно намереваетесь ПОЛОЖИТЬ штат / провинцию в полном объеме?

0 голосов
/ 06 декабря 2011

Спасибо, ребята.

Еще раз (неудивительно), это похоже на синтаксическую ошибку. Когда я использовал следующее:

<stateProvince> 
       <countryId> 
           <countryId>1</countryId> 
      </countryId> 
       <stateName>New South Wales</stateName> </stateProvince>

Привет, это работает. Мне не удалось внедрить countryId, как показано выше (см. Старый код ниже)

<stateProvince> 
       <countryId>1</countryId> 
       <stateName>New South Wales</stateName> </stateProvince>

И спасибо, Даг, - ваш ответ - это то понимание, которое я ищу. Я не верю, что я полностью сосредоточился на использовании ссылок, как вы описываете, - но сейчас я буду исследовать дальше

...