宁静的Web服务 - 维护外键

时间:2011-12-05 22:29:35

标签: java mysql sql rest relational-database

我是否误解了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 ])

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>

感谢道格 - 你的回答是我所寻求的那种洞察力。我不相信我已经完全围绕你所描述的链接的使用 - 但我现在将进一步调查