Coxer
Coxer

Reputation: 1704

UUID madness with mssql

My database entry has a UUID with the value (extracted using the Microsoft SQL Server Management Studio)

CDF86F27-AFF4-2E47-BABB-2F46B079E98B

After this is loaded into my Scala application, the toString method yields this value

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

How does this happen? And how can I programmatically create a UUID instance, when I have only the bare string CDF86F27-AFF4-2E47-BABB-2F46B079E98B at hand?

Relevant Slick code (former: table definition, latter: database access object)

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
  }
  [...]
}

Upvotes: 11

Views: 7794

Answers (2)

SoftwareCarpenter
SoftwareCarpenter

Reputation: 3923

Slick converts a UUID to a uniqueidentifier differently then SQL Server.

endianness is unspecified in .NET / SQL Server.

Make sure to use big endian encoding for UUIDs to be consistent with the JVM if you are getting the UUID from MSSQL.

Check out this SO post. Looks like you will need to create a method to translate the UUID.

How to read a .NET Guid into a Java UUID

Upvotes: 2

serejja
serejja

Reputation: 23881

Works fine for me:

> 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

Upvotes: 0

Related Questions