Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Restful Web服务-维护外键_Java_Mysql_Sql_Rest_Relational Database - Fatal编程技术网

Java Restful Web服务-维护外键

Java Restful Web服务-维护外键,java,mysql,sql,rest,relational-database,Java,Mysql,Sql,Rest,Relational Database,我是否误解了RESTfulWeb服务的基本概念?我有一个Android应用程序,我正在尝试使用Restful PUT。两个Mysql表Country和StateProvince,countryId为StateProvince表上的外键 如果我尝试使用以下命令执行PUT-to-StateProvince Victoria1 我得到下面的错误。我是否误解了外键和Rest的基本概念 Exception [EclipseLink-4002] (Eclipse Persistence Services -

我是否误解了RESTfulWeb服务的基本概念?我有一个Android应用程序,我正在尝试使用Restful PUT。两个Mysql表Country和StateProvince,countryId为StateProvince表上的外键

如果我尝试使用以下命令执行PUT-to-StateProvince

Victoria1

我得到下面的错误。我是否误解了外键和Rest的基本概念

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 ])

简短回答:country_id为null,因此这看起来像是数据库/持久性问题。您可能没有为StateProvince设置国家(或者将StateProvince添加到国家-没有看到您的代码,所以我不知道您是如何映射的)

长答覆:

为什么会有一个数据库标识符作为HTTP请求的一部分出现

您需要开始考虑URI和资源——您的StateProvince表示应该具有某种与特定URI处的国家相关的链接(例如,
),并且在处理PUT动词的资源类中,您需要能够将该URI转换为域对象,即实体(看起来您使用的是EclipseLink),您可以使用一些setter方法或其他方法来建立数据库关系。REST关系和数据库关系是根本不同的。

在持久化单元中处理看似简单的概念(HTTP verbage)需要实践和仔细思考。一些看似简单的东西,如
PUT
,需要进行非平凡的处理,才能使其像REST所期望的那样工作


在URI中使用数据库标识符很有诱惑力,因为这很容易(特别是如果您使用的子资源恰好神奇地知道其父对象是谁:例如country/1/stateprovince/2)但你必须退一步问问自己,是国家/地区还是国家/美国?你还必须问问自己,国家和州/省真的是一个实体吗?还是只是一个价值对象?你真的打算把一个州/省作为一个整体吗?

简短回答:国家/地区id为空,所以这看起来像是一个数据库/持久性问题。Y您可能没有为StateProvince设置国家(或者将StateProvince添加到国家-没有看到您的代码,所以我不知道您是如何映射的)

长答覆:

为什么会有一个数据库标识符作为HTTP请求的一部分出现

您需要开始考虑URI和资源——您的StateProvince表示应该具有某种与特定URI处的国家相关的链接(例如,
),并且在处理PUT动词的资源类中,您需要能够将该URI转换为域对象,即实体(看起来您使用的是EclipseLink),您可以使用一些setter方法或其他方法来建立数据库关系。REST关系和数据库关系是根本不同的。

在持久化单元中处理看似简单的概念(HTTP verbage)需要实践和仔细思考。一些看似简单的东西,如
PUT
,需要进行非平凡的处理,才能使其像REST所期望的那样工作

在URI中使用数据库标识符很有诱惑力,因为这很容易(特别是如果您使用的子资源恰好神奇地知道其父对象是谁:例如country/1/stateprovince/2)但你必须退一步问问自己,是国家/地区还是国家/美国?你还必须问问自己,国家和州/省真的是一个实体吗?还是只是一个价值对象?你真的打算把一个州/省作为一个整体吗?

谢谢大家

再次(毫不奇怪)它似乎是一个语法错误

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

1.
新南威尔士州
Hey presto它可以工作。我没有像前面所示嵌入countryId(参见下面的旧代码)


1.
新南威尔士州
谢谢道格-你的回答正是我所寻求的见解。我不相信我对你所描述的链接的使用有太多想法-但我现在将进一步调查

谢谢大家

再次(毫不奇怪)它似乎是一个语法错误

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

1.
新南威尔士州
Hey presto它可以工作。我没有像前面所示嵌入countryId(参见下面的旧代码)


1.
新南威尔士州

多谢道格-你的回答正是我所寻求的见解。我不相信我对你所描述的链接的使用有太多的想法-但我现在将进一步调查

这是一个SQL/数据库问题,与REST无关。你的PUT请求体中有国家id吗?有效的国家id吗服务器端代码是否正确处理国家id?这是一个SQL/数据库问题,与REST无关。PUT请求正文中是否包含国家id?有效的国家id?服务器端代码是否正确处理国家id?