2012-01-02 3 views
1

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

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; 
    } 

} 

I я автоматически извлекаю данные динамически с фронта, чтобы делать это каждый раз, когда отображаются статусы, последний статус сохраняется, и все статусы впоследствии отображаются (при большем значении 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(); 
} 

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

Любая помощь как можно скорее высоко оценили

Приветствия

ответ

0

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

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^