hibernate @JoinTable аннотация и критерии не работают должным образом - PullRequest
1 голос
/ 02 января 2012

У меня есть класс Tag, который хранит ссылку на набор статусов с помощью таблицы соединений TagStatus, в настоящее время в системе нет объекта для него

package com.iit.awt.application.domain;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="System_Table_Tag")
public class Tag implements Serializable {

    private static final long serialVersionUID = 4142565751324734722L;

    @Id
    @Column(name="TagId")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long tagId;

    @Column(name="TagText")
    private String tagText;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name = "System_Table_Tag_Status",
            joinColumns = {@JoinColumn(name="TagId")},
            inverseJoinColumns = {@JoinColumn(name="StatusId")})
    private List<Status> statuses;

    public Long getTagId() {
        return tagId;
    }

    public void setTagId(Long tagId) {
        this.tagId = tagId;
    }

    public String getTagText() {
        return tagText;
    }

    public void setTagText(String tagText) {
        this.tagText = tagText;
    }

    public void setStatuses(List<Status> statuses) {
        this.statuses = statuses;
    }

    public List<Status> getStatuses() {
        return statuses;
    }

}

Я автоматически получаю данные динамически изспереди, чтобы делать это всякий раз, когда отображаются статусы, сохраняется последнее состояние, а затем показываются все статусы (с большим значением statusId, поскольку идентификатор автоматически увеличивается)

Это моя функция класса дао здесь

@Override
public List<Tag> getTagDetailsUsingTagTextWithStatusFiltering(
        String profileText, Long latestStatus) {
    Criteria criteria = super.getCurrentSession().createCriteria(Tag.class);

    if(profileText!=null && profileText!=""){
        criteria.add(Restrictions.eq("tagText", profileText));
    }

    if(latestStatus!=null){
        criteria.createAlias("statuses", "stts");
        criteria.add(Restrictions.gt("stts.statusId", latestStatus));
    }

    return criteria.list();
}

Несмотря на то, что все работает нормально, все статусы возвращаются.ОДНАКО скажем, последний идентификатор статуса 37 и новых статусов не было, фильтрация работала бы нормально, и ничего нового не было бы возвращено, НО, если бы был новый статус, такой как с идентификатором статуса 38, ВСЕ статусы были бы возвращены, тогда как я хотел толькоone

Любая помощь как можно скорее приветствуется

Приветствия

1 Ответ

0 голосов
/ 02 января 2012

Это ожидается.Тег имеет набор статусов, и коллекция статусов в классе Tag содержит все эти статусы.Если этого не произошло, и вы добавили статус в набор статусов в теге, ожидаете ли вы, что все незагруженные статусы будут удалены из базы данных?Кроме того, ваш запрос выполняет следующие действия:

select tag from Tag tag inner join tag.statuses status where status.statuesId > :latestStatus

, поэтому он выбирает только теги.Затем, так как вы сконфигурировали коллекцию состояний для выборочной выборки, набор дополнительных статусов тега загружается из дополнительного запроса из базы данных.

Если вы хотите загрузить частичное представление сущностей,тогда вы не должны загружать объекты.

Обратите внимание, что Hibernate позволяет загружать частичные объекты, но эту функцию следует использовать с осторожностью, поскольку она очень опасна.Используйте эти частичные объекты только так, как если бы они были DTO только для чтения.Также обратите внимание, что это поведение не поддерживается другими движками JPA.

Если вы хотите загрузить тег с частичным набором его статусов, вы должны сделать это в одном запросе, добавив режим выборки для статусов:

criteria.setFetchMode("statuses", FetchMode.JOIN);
...