我正在尝试UUID使用Hibernate将POJO中的列映射到SQL Server表列.
注释应用如下:
@Id
@GeneratedValue
@Column(name = "Id", columnDefinition = "uniqueidentifier")
public UUID getId(){ ... }
Run Code Online (Sandbox Code Playgroud)
但是,似乎Java Hibernate映射和SQL服务器之间存在一些字节序问题.
例如,在我的Java应用程序中,我将id表示为:
4375CF8E-DEF5-43F6-92F3-074D34A4CE35
ADE3DAF8-A62B-4CE2-9D8C-B4E4A54E3DA1
Run Code Online (Sandbox Code Playgroud)
而在SQL Server中,这些表示为:
8ECF7543-F5DE-F643-92F3-074D34A4CE35
F8DAE3AD-2BA6-E24C-9D8C-B4E4A54E3DA1
Run Code Online (Sandbox Code Playgroud)
有没有办法在双方都有相同的代表?
请注意,uniqueidentifier它仅用于uniqueidentifier在SQL Server中具有类型ID而不是类型binary; 当存在同样的问题uniqueidentifier,从注释移除(可观察到该问题通过转换binary是uniqueidentifier).
我的数据库条目具有值的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) …Run Code Online (Sandbox Code Playgroud) 嗯,"Endianness"主题对我来说总是有点混乱,但我从来没有遇到任何问题,这些问题要求我甚至考虑我使用的二进制编写器/阅读器的默认行为.我正在c#中写一个PNG解码器.PNG文件格式规范声明所有数字都以大端符号存储(我觉得非常自然).但是,当我注意到.NET的BinaryReader/Writer使用一点endian符号时,我感到非常惊讶.令我更加困惑的是,事实上,java的二进制IO与大端符号一起工作(不是java程序员,所以也许我错了).所以我开始考虑以下问题:
1 - 为什么它们是这样的?我的意思是基类库的默认行为.2 - 为什么在使用.NET的System.IO时无法选择首选符号?
我目前正在使用Jon Skeet的 MiscUtil,它就像一个魅力(感谢,man =)).但是在基类库中看到这个功能会很酷.
我使用以下代码将 C# 中的 Guid 转换为 Base64:
var id = Guid.Parse("be9f1bb6-5c8e-407d-85a3-d5ef31f21b4d");
var base64=Convert.ToBase64String(id.ToByteArray());
Run Code Online (Sandbox Code Playgroud)
输出
thufvo5cfUCFo9XvMfIbTQ==
当我尝试使用以下命令在 Java 中执行相同操作时:
java.util.Base64.Encoder encoder=Base64.getEncoder();
UUID uuid = UUID.fromString("be9f1bb6-5c8e-407d-85a3-d5ef31f21b4d");
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
encoder.encodeToString(bb.array());
Run Code Online (Sandbox Code Playgroud)
输出不同
vp8btlyOQH2Fo9XvMfIbTQ==
我的 Java 代码做错了什么?如何才能获得与使用 C# 相同的结果?
我有一个外部数据库,正在向我提供信息.一个将其数据保存为本机GUID格式,而我的其他数据源提供标准.NET GUID格式字符串.
有没有一种整洁的方式从Native GUID转换为GUID结构?
还有任何验证位来确定提供的值是否为Native GUID?如果有的话我似乎找不到任何东西.
区别如下:
typedef struct _GUID
{
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
Run Code Online (Sandbox Code Playgroud)
Data1,Data2和Data3的字节顺序相反,但Data4保持不变,请参阅http://en.wikipedia.org/wiki/Globally_unique_identifier了解更多信息
java ×3
.net ×2
sql-server ×2
uuid ×2
base64 ×1
c# ×1
datamapper ×1
endianness ×1
guid ×1
hibernate ×1
scala ×1
vb.net ×1