当前位置: 首页 > 面试题库 >

休眠类型解析器

卜方伟
2023-03-14
问题内容

我知道休眠最近在3.6中重做了它的类型系统。我认为这现在允许您将Java类与类型(或UserType)相关联。例如,我使用joda-
time并具有几个UserType,它们将LocalDate和LocalDateTime映射到适当的SQL类型。

当使用对象时,这很好用,但是如果我想传递一个joda类型作为HQL参数,hibernate会感到困惑,所以我必须记住每次打电话时都要提供Type。

query.setParameter( "now", new LocalDateTime(), Hibernate.custom( LocalDateTimeType.class ) );

我认为现在可以在Configuration / SessionFactory设置阶段说LocalDateTime->
LocalDatetimeType,但是我不确定如何执行此操作。我找到了TypeResolver,但是难以理解我应该调用哪种方法来实现此目的。

或者,即使使用3.6中的新类型内容也无法解决此问题,请纠正我。


问题答案:

回答我自己的问题。

知道如何就足够简单。

configuration.getTypeResolver().registerTypeOverride( LocalDateTimeType.TYPE, new String[]{ LocalDateTime.class.getName() } );
configuration.getTypeResolver().registerTypeOverride( LocalDateType.TYPE, new String[]{ LocalDate.class.getName() } );

未知类型的TypeResolver查找使用类名,因此在注册键完成该工作时注册类的全名。



 类似资料:
  • 问题内容: 在对象级别,实体类型和值类型之间有什么区别?我知道实体将具有ID,但值将没有,但为什么我们需要不同的方式来映射实体与值类型? 这样做是为了让hibernate状态可以对值类型应用任何优化? 问题答案: 实体已经定义了表的持久化位置。因此,当您在实体A中拥有B实体的列表时,则无需为B定义目标表:B已经定义了它。值类型没有任何关联的表,因此实体A 中的in 映射必须定义将使用哪个表来存储此

  • 问题内容: 我有一个包含三个字段的表,例如a,b,c。我想添加一个约束,以确保如果a不为null,那么b和c也不为null。我已经使用以下SQL做到了 有没有一种方法可以使用hibernate注释@Check达到相同的效果? 我找不到带有该注释的有用示例,开发人员是否倾向于完全不使用它? 问题答案: 是的,可以在类级别使用,例如: (请注意,我使用@jarlh注释重写了您的情况。)该条款注释需要参

  • 问题内容: 我收到错误消息: org.hibernate.TypeMismatchException:为类BEntity提供了错误类型的ID。预期:类BEntity,得到类AEntity HQL查询: hibernate源代码 当我在SQL Explorer中运行代码时,只能在代码中运行它会导致问题… 问题答案: 看来这是hibernate3.2.6版中的一个缺陷,该缺陷仍未解决。碰到了这个JIR

  • 问题内容: 我们一直在使用GenericEnumUserType进行可扩展的枚举,并且我们的类无法在Hibernate 3.6+容器上的JBoss 6中加载。 引发以下错误 在以下代码上 问题答案: 不幸的是,如果您需要基于Enum的序数或名称之外的其他内容进行序列化,则@Enumerated无效。我设法找到了一种解决方案(从此处进行了稍微修改)。

  • 问题内容: 我的Java模型上有一个枚举类型,我想映射到数据库中的表。我正在使用休眠注释,但我不知道该怎么做。由于我搜索的答案比较旧,我想知道哪种方法最好? 提前致谢 问题答案: 除了注释,您还需要其他东西吗?例如,以下枚举: 可以这样使用和注释: 您可以使用批注的enum属性指定枚举应如何在数据库中持久化。指定该枚举将作为整数值保留。在这里,设置为将永久保存为0,保留为1,依此类推。 替代方法是

  • 问题内容: 我有一个hibernate映射,该映射一直工作到最近-尽管我确定这是我所做的某些更改的结果,但我似乎找不到它。 映射文件将字段定义为: 该类将该字段定义为: 运行此代码时,出现以下错误: 与此对应的数据库字段定义为: 我还有其他几个具有相似结构和定义的类,并且它们没有问题。但是,可能由于我最近所做的一些更改而导致,此特定映射将不再正常工作。 有什么建议么? 问题答案: 我不确定,但是您