java - Hibernate @Filter 未应用于关联

标签 java hibernate hibernate-mapping

我无法弄清楚为什么我的过滤器没有应用于关联。

我可以看到它正在注册

06 Mar 2014 02:55:33,039 [INFO]  (main) org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean: Building new Hibernate SessionFactory
06 Mar 2014 02:55:33,039 [DEBUG]  (main) org.hibernate.cfg.Configuration: Preparing to build session factory with filters : {addressType=org.hibernate.engine.FilterDefinition@1015ee3d}
06 Mar 2014 02:55:40,172 [DEBUG]  (main) org.hibernate.impl.SessionFactoryImpl: Session factory constructed with filter configurations : {addressType=org.hibernate.engine.FilterDefinition@1015ee3d}

下面是我的课

@Entity
@Table(name = "person")
@FilterDef(name = "addressType", parameters = @ParamDef(name = "addressType", type = "string"))
public class Person {

    @Id
    @Column(name = "EMPLID", nullable = false)
    private String employeeId;

    @OneToMany
    @JoinColumn(name = "EMPLID")
    @Filter(name = "addressType", condition = ":addressType = ADDRESS_TYPE")
    private Set<PersonAddressHistory> personAddressHistories;

    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(final String employeeId) {
        this.employeeId = employeeId;
    }


    public Set<PersonAddressHistory> getPersonAddressHistories() {
        return personAddressHistories;
    }

    public void setPersonAddressHistories(final Set<PersonAddressHistory> personAddressHistories) {
        this.personAddressHistories = personAddressHistories;
    }

    @Override
    public String toString() {
        return Objects.toStringHelper(this).add("employeeId", getEmployeeId()).toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Person)) {
            return false;
        }
        Person other = (Person) obj;

        return Objects.equal(getEmployeeId(), other.getEmployeeId());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getEmployeeId());
    }

}


@Entity
@Table(name = "address_history")
public class PersonAddressHistory implements Serializable {

    @Column(name = "EMPLID", nullable = false)
    private String employeeId;

    @Id
    @Column(name = "ADDRESS_TYPE", nullable = false)
    private String addressType;

    @Id
    @Column(name = "EFFDT", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar effectiveDate;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "addressLine1", column = @Column(name = "ADDRESS", nullable = false)),
            @AttributeOverride(name = "city", column = @Column(name = "CITY", nullable = false)),
            @AttributeOverride(name = "state", column = @Column(name = "STATE", nullable = false)),
            @AttributeOverride(name = "country", column = @Column(name = "COUNTRY", nullable = false)),
            @AttributeOverride(name = "postalCode", column = @Column(name = "POSTAL", nullable = false)) })
    private Address address;

    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(final String employeeId) {
        this.employeeId = employeeId;
    }

    public String getAddressType() {
        return addressType;
    }

    public void setAddressType(final String addressType) {
        this.addressType = addressType;
    }

    public Calendar getEffectiveDate() {
        return effectiveDate;
    }

    public void setEffectiveDate(final Calendar effectiveDate) {
        this.effectiveDate = effectiveDate;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(final Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return Objects.toStringHelper(this).add("employeeId", getEmployeeId()).add("addressType", getAddressType())
                .add("address", getAddress())
                .toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof PersonAddressHistory)) {
            return false;
        }
        PersonAddressHistory other = (PersonAddressHistory) obj;

        return Objects.equal(getEmployeeId(), other.getEmployeeId())
                && Objects.equal(getAddressType(), other.getAddressType())
                && Objects.equal(getEffectiveDate(), other.getEffectiveDate());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getEmployeeId(), getAddressType(), getEffectiveDate());
    }

}

And in my DAO

public class PersonDao extends AbstractBaseDao {

    public Person getPersonById(final String id) {
        getCurrentSession().enableFilter("addressType").setParameter("addressType", "HOME");
        return (Person) getCurrentSession().get(Person.class, id);
    }

}

我正在使用旧模式。 另外,如果我要过滤 java.util.Calendar 实例,我应该在 hibernate @FilterDef 注释中指定什么参数类型 - “java.util.Calendar”或只是“Calendar”。

提前致谢。

最佳答案

尝试更改 FilterDef 的注释,将其移至 PersonAddressHistory 类:

@Entity 
@Table(name = "person") 
@FilterDef(name = "addressType", parameters = @ParamDef(name = "addressType", type = "java.lang.String")) 
public class PersonAddressHistory implements Serializable {

关于java - Hibernate @Filter 未应用于关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214187/

相关文章:

java - MyEclipse+Hibernate 不按 ID 对属性集排序?

Hibernate 在更新父实体的同时更新子实体

java - 保存我的对象时出现 Hibernate 异常

Java静态序列化规则?

java - Linux 上 Java 中的 IP 地址

java - Hibernate 注释上的映射问题

hibernate - 为什么此枚举参数适用于单个字段而不适用于集合?

java - Spring 4.3.0.RELEASE + Hibernate 5.2.0.Final - MySQL 上的 GeneratedValue

java - Android JDOM2 xml解析,IOExcetion

java - 制作一个真正弹出的 JPopupMenu