2012-12-08 4 views
3

Я делаю первые шаги с помощью Play! Framework (v2.1-rc1) с Java, и теперь я столкнулся с первой проблемой с ebean. У меня есть объект навигации с отношением ManyToOne к себе. Как только я пытаюсь получить доступ поле заголовка в parentNavigation, я получаю следующее сообщение об ошибке:EntityNotFoundException: Bean удален - ленивая загрузка не удалась

[EntityNotFoundException: Bean has been deleted - lazy loading failed]

Как выяснилось, ошибка появляется только если родитель навигации не существует в базе данных. Должен ли я получить пустой объект навигации в этом случае?

Навигация Entity:

package models; 

import javax.persistence.*; 
import play.db.ebean.*; 

@Entity 
public class Navigation extends Model { 

    @Id 
    public Long id; 

    @Column(name="c_title") 
    public String title; 

    @Column(name="id_parent") 
    public Long parentId; 

    @ManyToOne() 
    @JoinColumn(name="id_parent") 
    public Navigation parentNavigation; 

    public static Finder<Long,Navigation> find = new Finder<Long,Navigation>(
     Long.class, Navigation.class 
    ); 
} 

Мои действия в контроллере:

public static Result index() { 
    Navigation navigation = Navigation.find.byId(2L); // this one doesn't work, but the entry with ID 30 does 
    return ok(views.html.app.index.render(navigation)); 
} 

И мое мнение:

@(navigation: Navigation) 

@main("Welcome to Play 2.0") { 

    This navigation: @navigation.title <br> 
    Parent: @navigation.parentNavigation.title 

} 
+0

Показать, как вы пытаетесь получить объект и получить доступ к родительскому – biesior

+0

Я обновил свой вопрос. – android

ответ

6

Если я правильно понимаю, у вас есть строка с parent_id колонкой, содержащей 2 (например), но нет строки с идентификатором 2 в таблице.

Если да, то это нормально, чтобы получить исключение. Очистите данные, установив все эти несуществующие parent_id в NULL и добавьте ограничение внешнего ключа в столбец parent_id, чтобы эта ситуация больше не повторялась.

+0

Да, это точно моя проблема. К сожалению, мне приходится работать с базой данных так, как есть, поэтому я не могу добавить внешний ключ. Есть ли другой путь? – android

+0

Существует способ с Hibernate с аннотацией NotFound, но я не знаю, поддерживает ли EBean такую ​​вещь. Это не стандартная JPA. Обратите внимание, что отсутствие внешнего ключа не является причиной проблемы. Проблема вызвана некогерентностями в данных, что внешний ключ поможет избежать в будущем. Что мешает вам удалить эти неправильные ссылки на неиспользуемые строки в базе данных? В любом случае, они никому не нужны. –

+0

Конечно, я мог бы установить id_parent в NULL, если родитель больше не существует. Но так как мне приходится работать с сторонним CMS для внутреннего использования, эта проблема будет происходить все время. Что-то вроде аннотации NotFound не существует, по крайней мере, мой поиск в Google сказал мне об этом. Может быть, мне нужно сбросить EBean и переключиться на JPA? Я действительно потерян. :/ – android

1

В очень общем это всегда лучше, чтобы проверить отношения ISN» t null, прежде чем пытаться получить к нему доступ:

This navigation: @navigation.title <br> 
Parent: @if(navigation.parentNavigation != null){@navigation.parentNavigation.title} else {This nav has no parent} 

Конечно, вы можете пропустить пункт else если это не требуется

+0

Я уже пробовал это, но он все равно выдает ошибку. :/ – android