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

如何使用休眠注释在Lob / Clob / tinyblob上添加索引

仇迪
2023-03-14
问题内容

我有一个使用Hibernate映射到数据库的bean。我正在使用Hibernate Annotations指示所需的映射并创建索引。彻底简化的代码如下所示。

我的问题是我的byte
[]字段上的索引未创建;特别是没有创建我的多字段索引sysUuid(请参阅示例代码)。在Hibernate调试日志中,我什至看不到尝试创建索引的尝试!

我想指出的是,uuid字段上的@Index注释也不会导致数据库上的索引。

我确实知道如何使用MySQL手动创建索引:

create index sysuuid on persons ( system, `uuid`(8) );

其中有趣的功能是需要转义uuid(因为它是MySQL函数),并且必须在字段上指定长度(与文本字段一样)。

但是,我还没有找到使用Hibernate Annotations赋予索引长度字段的方法,因此我无法测试是否是问题所在。但是,可以确定在注释中命名字段“
uuid(8)”不起作用。

@Entity
// The UniqueConstraints work 
@Table(name = "persons", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"uid", "system"}) } )
// but these don't generate an index
@org.hibernate.annotations.Table(appliesTo="persons", 
   indexes={@Index(name="sysUuid",  columnNames={"system", "uuid"})  } )
public class Person  {
    @Basic 
    @NotNull
    private String uid;

    @Basic
    private int system;

    // Gets mapped to tinyblob
    @Basic
    @Size(min = 16, max = 16)
    private byte[] uuid;

    // getters and setters here 
}

我想问你的是:是否可以使用注释在lob上添加索引,如果可以,怎么做?

编辑

我确实有可能转向基于字符串的UUID,但我对此并不满意,因为uuid从概念上讲是一个16字节的标识符。

我强烈希望Java类型与问题域匹配。

正如我所说-我确实有一条SQL语句,因此可以部署代码+ SQL脚本。我只是认为在可行的情况下最好有自我记录的代码。

编辑和增加赏金

我相信我无法使用Hibernate Annotations(关于Matt Solnit的回答)来创建所需的索引。

但是,我希望能获得更多有关使用Hibernate Annotations创建索引的更多信息,因此最终的答案最终记录了API的局限性。


问题答案:

您可以使用Hibernate的辅助对象支持来执行此操作,但是不能使用注释:-(。

在您的示例中,它看起来像这样(为简洁起见,省略了很多东西):

<class name="Person" table="persons">
  <!-- whatever -->
  <database-object>
    <create>create index sysuuid on persons ( system, `uuid`(8) )</create>
    <drop>drop index sysuuid</drop>
    <dialect-scope name="org.hibernate.dialect.MySQL5InnoDBDialect" />
  </database-object>
</class>

对于缺少基于注释的答案,我深感抱歉:-(。希望能有所帮助。

注意 :如果您采用这种方法,请注意方言作用域必须 完全
匹配。例如,如果您的Hibernate配置说要使用MySQL5InnoDBDialect,那么您也必须在<dialect- scope>元素中包含该方言。MySQLDialect即使它是InnoDB方言的超类,也无法使用。



 类似资料:
  • 问题内容: 什么和何时在休眠状态下使用DiscriminatorValue注释的最佳方案是什么? 问题答案: 这两个链接帮助我最了解继承概念: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa1.html?page=6 要了解

  • 问题内容: 在过去的两个月中,我一直在使用Eclipse。我以前没有在其中使用javadocs。今天,我搜索了hibernate javadocs,并获得了hibernate-3.2.2.ga-javadoc.jar。但是我不知道如何在日食中添加它。有什么建议么!! 问题答案: 在Eclipse中包含hibernet的简单步骤...... 访问 http://www.jboss.org/tools

  • 问题内容: 休眠注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,

  • 问题内容: 我想使用联接表在两个表之间建立一对多关系。 最后,我想使用Hibernate批注执行此操作。 我找到了一些使用xml映射执行此操作的示例,但没有带注释的示例。 我相信这就是需要创建表的方式 问题答案: 不要寻找例子。阅读官方文档: 另外,请注意,这是单向一对多关联的默认设置。因此,如果默认的表名和列名适合您,您甚至不必提供注释。

  • 问题内容: 在这里hibernate新手。我正在研究一个简单的Hibernate映射文件。当我使用xml方法时,我将生成器类设置为Assigned。在分配员工ID之前,必须先检查某些逻辑,这样我才能自动生成它。 但是我也在研究注释类型,并且随着框架从配置文件移开,如今注释似乎已经成为现实。但是我找不到任何与分配值匹配的世代类型 这是否意味着分配时不需要添加任何序列生成器注释?谢谢 问题答案: 只需

  • 问题内容: 它为什么如此重要?根据XML映射的优势是什么?你能解释这些吗?谢谢。 问题答案: 它不是“强制性”中的重要内容。有优势和劣势的可能性是不同的。 优点: 编译时检查:如今在IDE中,用Java(而不是Xml)编写非常易于使用。启动应用程序(渐进式编译)时,没有发现 更多错别字 ,也没有什么值得记住的( 完成 )… 使用代码进行本地化(类级别):不必打开两个文件(java和xml)以获取完