我正面临着与UUID有关的奇怪问题。
我使用Symfony2 + FOSRestBundle + JMSSerializer开发了一个REST API。由于我需要从两个来源更新一些表,我想到使用UUID作为一个实体的主键。
我做了一个学说:mapping:import在我的Symfony项目中生成实体。一切都正确。我最终得到了以下实体(为了简单起见,只暴露了关键字段和生成的getter):
<?php
namespace Stardigita\TgaAPIBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* TgaBookings
*
* @ORM\Table(name="tga_bookings", indexes={[...]})
* @ORM\Entity
*/
class TgaBookings
{
/**
* @var string
*
* @ORM\Column(name="book_cd_booking_UUID", type="blob", length=16, nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $bookCdBookingUuid;
/**
* Get bookCdBookingUuid
*
* @return string
*/
public function getBookCdBookingUuid()
{
return $this->bookCdBookingUuid;
}
...
未生成任何setter。我仍然可以自己做,我会,因为我需要事先知道密钥。
此字段的数据以BINARY(16)的形式正确存储在表中。当我恢复调用REST GET方法的数据时,我得到了这个:
[
{
"book_cd_booking_uuid": "Resource id #1244",
"book_cd_booking": 8,
....
我的问题是:如何从现场获取实际数据?
我想在现场吸气器中必须要做些什么,但我尝试了一些解决方案而没有任何成功。
感谢。
更新: 我已设法记录实际数据,以这种方式修改getBookCdBookingUuid方法:
/**
* Get bookCdBookingUuid
*
* @return string
*/
public function getBookCdBookingUuid()
{
return bin2hex($this->bookCdBookingUuid);
}
并将类型更改为&#34; guid&#34;在属性注释中:
/**
* @var string
*
* @ORM\Column(name="book_cd_booking_UUID", type="guid", length=16, nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $bookCdBookingUuid;
我在日志中正确表示了十六进制UUID,然后在控制器中返回结果:
[2014-11-03 19:52:07] app.ERROR: 1046684e5f6711e4a09f00089bce936a [] []
但是仍然有关于UTF无效字符的异常:
request.CRITICAL: Uncaught PHP Exception RuntimeException: "Your data could not be encoded because it contains invalid UTF8 characters." at /var/www/tga_api/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php line 36 {"exception":"[object] (RuntimeException: Your data could not be encoded because it contains invalid UTF8 characters. at /var/www/tga_api/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php:36)"} []
此外,我没有得到该服务的回复。返回500错误。
拜托,我需要解决这个问题。欢迎任何想法。
感谢。
答案 0 :(得分:1)
我注意到您正在使用注释@ORM\GeneratedValue(strategy="IDENTITY")
作为UUID属性。 IDENTITY
表示数据库应该/将使用自动增量,在使用UUID时不应该这样做。请将其更改为@ORM\GeneratedValue(strategy="NONE")
或完全删除。
UUID的字符串形式(如01234567-89ab-cdef-0123-456789abcdef
)在数据库中保留时应转换为二进制形式,并在从数据库中提取时转换回来。
最简单的方法是引入自定义类型。有关示例,请参阅here。
Doctrine(甚至master / 2.5)在关联中使用UUID存在一些问题。我试图在PR #1178中解决这些问题。
如果您需要关联中的UUID并且不能等到它被修复,那么使用常规整数ID并使UUID是一个单独的列。