Что является наилучшей практикой в ​​отношении одного-многих спящих - PullRequest
4 голосов
/ 20 мая 2010

Я считаю, что это распространенный сценарий. Скажем, у меня есть отображение один-много в hibernate: Category имеет много Items


Категория:

@OneToMany(
    cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
@JoinColumn(name="category_id")
@Cascade(
    value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN
)
private List<Item> items;

Пункт:

@ManyToOne(targetEntity=Category.class,fetch=FetchType.EAGER)
@JoinColumn(name="category_id",insertable=false,updatable=false)
private Category category;

Все отлично работает. Я использую Category, чтобы полностью контролировать жизненный цикл Item. Но когда я пишу код для обновления Category, сначала я получаю Category из БД. Затем передайте его в UI. Пользователь заполняет измененные значения для Category и передает обратно. Здесь возникает проблема: поскольку я передаю только информацию Category, а не Items, коллекция Items будет пустой. Когда я позвоню saveOrUpdate, это очистит все ассоциации.

Любое предложение о том, что лучше для решения этой проблемы? Я думаю, что преимущество Category, управляющего Items, состоит в том, что он легко вводит порядок Items и не путает двунаправленный текст.

А как насчет ситуации, которую вы хотите просто обновить Category? Загрузите это сначала и объедините?

1 Ответ

1 голос
/ 22 октября 2012

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

1) Вы не упомянули, как вы выбираете объект Category перед передачей его в UI. Поэтому, если вы просто выбираете объект категории с помощью метода get load, вы можете просто создать отдельный метод инициализатора, который может загружать коллекцию элементов, просто вызывая метод getter. По методу getter загружается ленивый загруженный набор элементов, а затем вы можете передать его в UI. Пользователь просто изменит категорию, чтобы элементы остались прежними. После этого вы можете сохранить эту сущность, поэтому элементы останутся без изменений.

2) Если вы не хотите загружать коллекцию элементов перед переходом к пользовательскому интерфейсу, вы можете просто получить объект категории без загрузки коллекции элементов. Передайте его в UI. Как только пользователь изменяет и передает его обратно, вместо того, чтобы сохранять его напрямую, я предлагаю вам сначала получить последний объект категории для этого category_id и загрузить его элементы, вызвав методы получения, а затем заполнить измененные значения из возвращенной пользовательского интерфейса категории в эту последнюю выбранную категорию. Теперь вы можете сохранить этот объединенный объект, чтобы ваша коллекция предметов была в безопасности.

...