【问题标题】:UUID madness with mssql使用 mssql 的 UUID 疯狂
【发布时间】:2014-04-19 14:55:46
【问题描述】:

我的数据库条目有一个带有值的 UUID(使用 Microsoft SQL Server Management Studio 提取)

CDF86F27-AFF4-2E47-BABB-2F46B079E98B

将其加载到我的 Scala 应用程序后,toString 方法会生成此值

276ff8cd-f4af-472e-babb-2f46b079e98b

这是怎么发生的?当我手头只有裸字符串 CDF86F27-AFF4-2E47-BABB-2F46B079E98B 时,如何以编程方式创建 UUID 实例?

相关Slick代码(前:表定义,后:数据库访问对象)

class ChannelTable(tag: Tag) extends Table[ChannelTuple](tag, "Channel") {
  def id = column[UUID]("Id", O.PrimaryKey)
  def channelId = column[Int]("Channel_Id", O.NotNull)
  def timer = column[UUID]("Timer_Id", O.NotNull)
  def from = column[Timestamp]("FromTime", O.NotNull)
  def to = column[Timestamp]("ToTime", O.NotNull)
  def mon = column[Boolean]("Mon", O.NotNull)
  def tues = column[Boolean]("Tues", O.NotNull)
  def wed = column[Boolean]("Wed", O.NotNull)
  def thu = column[Boolean]("Thu", O.NotNull)
  def fri = column[Boolean]("Fri", O.NotNull)
  def sat = column[Boolean]("Sat", O.NotNull)
  def sun = column[Boolean]("Sun", O.NotNull)
  def * = (id, channelId, timer, from, to, mon, tues, wed, thu, fri, sat, sun)
}

object ChannelDAO extends EntityDAO[Channel, ChannelTuple] {
  private val entities = TableQuery[ChannelTable]
  [...]
  override def get(id: UUID)(implicit session: Session): Option[Channel] = {
    val y = for {
      a <- entities if a.id === id
    } yield (a)
    if (y.list.length > 1) throw new NonUniqueResultException
    y.firstOption
  }
  [...]
}

【问题讨论】:

  • 你的代码是什么样子的?数据库和 Slick 中的列使用哪种类型?
  • 列类型为 java.util.UUID
  • 我知道 .Net 的 Guids 二进制编码与 UUID 使用的不同,所以如果 Slick 不知道这一事实,它可能会解释你的问题。在 MSDN 上查看 Guid.ToByteArray 的文档
  • 我认为你是对的,但我怎样才能让 Slick 意识到这一点?你认为我必须为此编写自己的 UUID 类吗?

标签: sql-server scala uuid


【解决方案1】:

Slick 将 UUID 转换为唯一标识符的方式与 SQL Server 不同。

.NET / SQL Server 中未指定字节序。

如果您从 MSSQL 获取 UUID,请确保对 UUID 使用大端编码以与 JVM 保持一致。

查看这篇 SO 帖子。看起来您需要创建一个方法来翻译 UUID。

How to read a .NET Guid into a Java UUID

【讨论】:

  • 您也可以将 Slick 列更改为字符串而不是 java.util.UUID。
  • 是的,但我宁愿坚持最接近的匹配类型,即 UUID imho
【解决方案2】:

对我来说很好用:

> val uuidString = "CDF86F27-AFF4-2E47-BABB-2F46B079E98B"
uuidString: String = CDF86F27-AFF4-2E47-BABB-2F46B079E98B

> java.util.UUID.fromString(uuidString)
res2: java.util.UUID = cdf86f27-aff4-2e47-babb-2f46b079e98b

【讨论】:

  • 这是真的。但是,当我通过 slick 从数据库加载实体时,UUID 会打印值“276ff8cd-f4af-472e-babb-2f46b079e98b”o.O - 对于完全相同的实体
  • 添加代码以更好地说明问题
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2011-02-19
相关资源
最近更新 更多