Hibernate Search 和组合键使用@IdClass
Hibernate Search and composed key using @IdClass
我在将 Hibernate Search 集成到具有数百个实体的现有项目中时遇到问题,但至少有一半的实体使用 @IdClass 注释作为组合键。我可以使用注释@IdClass 解决问题吗?
我也看了这个post Hibernate search and composed key但是我没能解决我的问题。
我有以下例子:
实体class:
@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.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 注解,你能告诉我有什么选择吗?
非常感谢您。
另一种方法是添加一个新的 属性 以供 Hibernate Search 用作 Id。您可以用 @DocumentId
标记它,让 Hibernate 搜索引擎将替代项 属性 视为索引中的标识符。
当然,您需要确保这个新的 属性 是唯一的;这通常可以通过从真实 ID 生成 String
来完成。您可能想用 @Transient
注释新的 getter,这样它就不会持久保存在数据库中。
我在将 Hibernate Search 集成到具有数百个实体的现有项目中时遇到问题,但至少有一半的实体使用 @IdClass 注释作为组合键。我可以使用注释@IdClass 解决问题吗?
我也看了这个post Hibernate search and composed key但是我没能解决我的问题。
我有以下例子:
实体class:
@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.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 注解,你能告诉我有什么选择吗?
非常感谢您。
另一种方法是添加一个新的 属性 以供 Hibernate Search 用作 Id。您可以用 @DocumentId
标记它,让 Hibernate 搜索引擎将替代项 属性 视为索引中的标识符。
当然,您需要确保这个新的 属性 是唯一的;这通常可以通过从真实 ID 生成 String
来完成。您可能想用 @Transient
注释新的 getter,这样它就不会持久保存在数据库中。