我是否误解了Restful Web服务的基本概念?我有一个Android应用程序,我试图使用Restful PUT。两个Mysql表Country和StateProvince with countryId是StateProvince表上的外键。
如果我尝试使用以下
对StateProvince进行PUT <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 ])
答案 0 :(得分:1)
简答:country_id为null,因此这看起来像数据库/持久性问题。你可能没有为StateProvince设置国家(或者将StateProvince添加到国家/地区 - 没有看到你的代码,所以我不知道你是如何映射事物的。)
长答案:
为什么数据库标识符会作为HTTP请求的一部分进入?
您需要开始考虑URI和资源 - 您的StateProvince表示应该有某种链接与特定URI(例如<link rel="country" href="/country/1" />
和您的国家/地区相关联处理PUT动词的资源类,您需要能够将该URI转换为域对象,实体(因为您似乎正在使用EclipseLink),您可以使用某些setter方法或其他东西来建立数据库关系。 REST关系和数据库关系根本不同。
需要练习和仔细思考来处理对于持久性单元的简单概念(HTTP verbage)。像PUT
这样看似简单的东西需要非常重要的处理才能使它像REST一样工作。
在URI中使用数据库标识符很有吸引力,因为它很容易(特别是如果你使用的子资源恰好可以神奇地知道他们的父母是谁:例如country / 1 / stateprovince / 2)但你必须退后一步你自己,是国家/ 1还是国家/美国 - 你还要问自己,国家和州/省真的是一个实体吗?还是只是一个价值对象?您真的打算完全投入州/省吗?
答案 1 :(得分:0)
谢谢你们。
再一次(不出所料)它似乎是一个语法错误。当我使用以下内容时:
<stateProvince>
<countryId>
<countryId>1</countryId>
</countryId>
<stateName>New South Wales</stateName> </stateProvince>
嘿presto它的工作原理。我没有嵌入countryId,如上所示(参见下面的旧代码)
<stateProvince>
<countryId>1</countryId>
<stateName>New South Wales</stateName> </stateProvince>
感谢道格 - 你的回答是我所寻求的那种洞察力。我不相信我已经完全围绕你所描述的链接的使用 - 但我现在将进一步调查