2014-09-04 1 views
0

Я пытаюсь решить проблему с категорией с дочерними категориями и родительской категорией на одном и том же объекте. Моя база данных уже установлена, и я не могу ее изменить. Итак, я сопоставляюсь моему Entity этого пути:JPA-сопоставление с отношением к одному объекту (категория, дочерние категории и родительская категория)

public class Category implements Serializable { 

    private static final long serialVersionUID = -3432724244623524272L; 

    @Id 
    @Column(name = "id") 
    private Long id; 

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

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

    @Column(name = "description") 
    private String description; 

    @ManyToOne(targetEntity = Category.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "parent_key", referencedColumnName = "key") 
    private Category parentCategory; 

    @OneToMany(mappedBy = "parentCategory", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private List<Category> childCategories; 

    //getters and setters ommited 
} 

отметить, что дочерние категории и родительская категория не отображаются с помощью атрибута ID, но «ключ» атрибут. Этот «ключ» не является FK. Когда JPA пытается получить данные, моя авария приложения. Но этот крах выглядит как бесконечный цикл. Никакое исключение не выбрасывается.

Что я делаю неправильно?

+0

Возможно, вас заинтересует этот вопрос: http://stackoverflow.com/questions/5818373/does-the-jpa-specification-allow-references-to-non-primary-key-columns – zbig

+0

Просто предложение, но Я бы сказал, пробный запуск, сначала установите fetch в FetchType.LAZY. –

ответ

0

Возможно бесконечный цикл:

  1. Вы загружаете объект А
  2. Этот объект имеет ребенка B, который загружается, а так как вы используете FetchType.EAGER
  3. B имеет родителя, который является, который загружается снова
  4. и т.д.

Попробуйте использовать FetchType.LAZY.