为每个子类创建单独的hibernate搜索索引

时间:2013-11-08 10:49:27

标签: java hibernate jpa java-ee-6 hibernate-search

我刚刚开始玩hibernate搜索。 如何解决以下问题。

从超类继承的所有java实体:

@SuppressWarnings("rawtypes")
@MappedSuperclass
@Indexed
public abstract class BaseEntity{

        private Integer id;
   private Integer jpaVersion;
   private Date creaDate;
   private Date modDate;
   private String creaUser;
   private String modUser;


        @Id
   @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   public Integer getId() {
     return this.id;
   }

   public void setId(Integer id) {
     this.id = id;
   }   
   .....

例如,我必须(还有更多)子类:

@Entity
@Indexed
@Table(name = "BASE_PERSON", schema = "MYSCHEMA")
public class Person extends extends BaseEntity{

private String firstName;
private String lastName;
....
....

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
  @Column(name = "LASTNAME", nullable = false, length = 50)
  @NotNull
  @Size(max=50)
  public String getLastName() {
    return this.lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
  @Column(name = "FIRSTNAME", length = 50)
  @Size(max=50)
  public String getFirstName() {
    return this.firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

和第二个:

@Entity
@Indexed
@Table(name = "BASE_USER", schema = "MYSCHEMA")
public class User extends extends BaseEntity{

private String userName;
....
....

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
  @Column(name = "USERNAME", nullable = false, length = 50)
  @NotNull
  @Size(max=50)
  public String getUserName() {
    return this.userName;
  }

  public void setUserName(String lastName) {
    this.UserName = UserName;
  }

  ....

运行创建整个索引的代码后,我得到了三个索引。超出我的预期。索引是:BaseEntity,Person和User。 但所有Persons和Useres都存储在索引BaseEntity中,而不是存储在它们自己的索引中。 有没有办法改变这一点,以便所有人都在索引人中,所有用户都在索引用户中?

或者这是hibernate搜索的常见行为吗?

谢谢和问候 LStrike

1 个答案:

答案 0 :(得分:4)

您需要从@Indexed中删除BaseEntity,您只需要在子类上进行注释。您仍然可以使用BaseEntity@Field中注释属性,使它们出现在子类索引中。