-1

У меня возникло несколько проблем с программированием на Java. В моем случае я использую запросы к критериям Hibernate через Spring getHibernateTemplate без прямого доступа к объекту сеанса.Передача ссылки объекта на анонимный класс

У меня есть отношения родитель-ребенок, сопоставленные с аннотациями JPA. Вот мой метод DAO

public List<Child> findByParent(final Parent parent) 
    { 
     return getHibernateTemplate().executeFind(new HibernateCallback<List<Child>>() 
     { 

      @Override 
      public List<Child> doInHibernate(Session session) throws HibernateException, SQLException 
      { 
       return session.createCriteria(Child.class) 
         .add(Restrictions.eq("parent", parent)) 
         .list(); 
      } 
     }); 
    } 

я пометил parent как окончательные, потому что я передаю его анонимный класс. Когда я запускаю код, Hibernate выполняет запрос (... where parentId = ?), но я не получаю никакого результата. Запуск его в mysql с правильным parentId возвращает результаты.

При отладке я вижу, что Eclipse не может проверить значение parent из анонимного класса. Что не так? Как это исправить?

[edit] Вот Pojo. Я не имею никакого контроля над Родителем (даже не источником, я просто нажал F3 для автоматических декомпилировать)

@Entity 
@SequenceGenerator(name = "SEQ_STORE", sequenceName = "SEQ_CHILD") 
@Table(name = "TA_CHILD", uniqueConstraints = { @UniqueConstraint(columnNames = { "A_FIELD", "PARENT_ID" }) }) 
public class Immobile 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "CHILD_ID") 
    protected int id; 

    @JoinColumn(name = "PARENT_ID") 
    @ManyToOne(fetch = FetchType.LAZY, optional = false, targetEntity = Organization.class) 
    protected Parent parent; 

    @GeneratedValue 
    @Column(name = "PARENT_ID", insertable = false, updatable = false) 
    protected String parentId; 
} 


// Compiled from Parent.java (version 1.6 : 50.0, super bit) 
@javax.persistence.Entity 
@javax.persistence.Table(name="TA_PARENT") 
public class org.Partent extends org.ExtensibleBase implements java.io.Serializable { 

    // Field descriptor #161 J 
    private static final long serialVersionUID = 1L; 

    // Field descriptor #166 Ljava/lang/String; 
    @javax.persistence.Id 
    @javax.persistence.Column(name="PARENT_ID", 
    nullable=false, 
    length=(int) 20) 
    private java.lang.String id; 

} 
+0

Можете ли вы опубликовать вам POJO, Child.java и Parent.java –

+0

'parent' не быть" прошел "где угодно. Скорее, «родитель» * захвачен * анонимным классом. – newacct

ответ

0

В ограничении, вы должны добавить критерии для идентификатора родительского лица Попробуйте ниже кода,

public List<Child> findByParent(final Parent parent) 
     { 
      return getHibernateTemplate().executeFind(new HibernateCallback<List<Child>>() 
      { 

       @Override 
       public List<Child> doInHibernate(Session session) throws HibernateException, SQLException 
       { 
        return session.createCriteria(Child.class) 
          .add(Restrictions.eq("parent.id", parent.getId())) 
          .list(); 
       } 
      }); 
     } 
0

В коде не было проблем. Просто после заполнения таблиц из Workbench MySQL я забыл зафиксировать транзакцию или отключить автоматическую фиксацию.

Оба фрагмента (мой и Притх) верны и возвращают все результаты.

Проблема решена, но это не объясняет, Eclipse, будучи не в состоянии оценить parent переменную, которая выходит за рамки

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