Hibernate使用@IdClass搜索和组合密钥

时间:2016-10-19 09:07:00

标签: hibernate-search

我在将现有项目中的Hibernate Search与数百个实体集成时遇到问题,但至少有一半的实体使用@IdClass注释作为组合键。我可以使用注释@IdClass来解决问题吗?

我也阅读了这篇文章Hibernate search and composed key,但我没有设法解决我的问题。

我有以下示例:

实体类:

@Entity
@Table(name="FAKVS_DB")
@IdClass(value=PK_FAKVS_DB.class)
@Audited
@Indexed
public class FAKVS_DB implements Serializable {

   @Id
   @Column(name="Key_FAM", length=10, nullable=false)l
   private String keyFam;

   @Id
   @Column(name="Komponentennr", nullable=false)
   private Integer komponentenNr;

  @Id
  @Column(name="Hinweis", nullable=true, length=4)
  private String hinweis;

  //getters and setters
}

和组合键:

public class PK_FAKVS_DB implements Serializable {

   private String keyFam;
   private Integer komponentenNr;
   private String hinweis;

   //getters and setters
 }

发生的错误是:

HSEARCH000058: HSEARCH000212: An exception occurred while the MassIndexer was transforming identifiers to Lucene Documents
java.lang.ClassCastException: package.entities.module.fi.pk.PK_FAKVS_DB cannot be cast to java.lang.Integer
at org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap(IntegerTypeDescriptor.java:36)
at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:63)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281)
at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1995)
at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1966)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
at org.hibernate.loader.Loader.doQuery(Loader.java:910)

如果我不能使用@IdClass注释你能告诉我有哪些替代方案吗?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

另一种方法是通过Hibernate Search添加一个新属性以用作 Id 。您可以使用@DocumentId对此进行标记,以使Hibernate搜索引擎将替代属性视为索引中的标识符。

您需要确保这个新属性当然是唯一的;这通常可以通过从真实ID生成String来完成。您可能希望使用@Transient注释新的getter,以便它不会在数据库中保留。

相关问题