hibernate OneToMany Упорядочивание списка сохраняется, но изменяется? - PullRequest
6 голосов
/ 22 мая 2009

У меня есть постоянная сущность, у которой есть список @OneToMany другой сущности, и мне нужно, чтобы порядок списков мог редактироваться пользователем, что прекрасно работает. Я могу полностью переупорядочить Список Java в памяти, и когда я сохраняю () объект, порядок ссылок в таблице ссылок меняется. Однако он изменяется в обратном порядке, заданном пользователем. Тем не менее, если вы вытяните сущность обратно до закрытия программы, она будет отображаться правильно, потому что она не перезагружается. Если вы перезагрузите программу, снова, это назад.

Разве это не то, что я должен делать, зависит от этого приказа? Но создание другого столбца заказа кажется излишним, поскольку в любом случае есть заказ, и я могу изменить его. Мне просто нужно, чтобы сохранить, а не назад.

Есть идеи?

Ответы [ 6 ]

4 голосов
/ 04 июля 2009

Hibernate поддерживает упорядоченные элементы с использованием аннотации IndexColumn.

Вот пример из книги "Сохранение Java с Hibernate" :

@org.hibernate.annotations.CollectionOfElements
@JoinTable(
name = "ITEM_IMAGE",
joinColumns = @JoinColumn(name = "ITEM_ID")
)
@org.hibernate.annotations.IndexColumn(
name="POSITION", base = 1
)
@Column(name = "FILENAME")
private List<String> images = new ArrayList<String>();
2 голосов
/ 03 октября 2013

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

   @Entity
    @Table(name = "my_library")
    public class MyLibrary implements java.io.Serializable{

    (...omitted)

    private List<Book> bookList = new ArrayList<Book>();   

    @OneToMany(mappedBy = "library", cascade = CascadeType.ALL)
    @OrderBy
    public List<Book> getBookList() {
        return bookList;
    }

    public void setBookList(List<Book> bookList) {
        this.bookList= bookList;
    }

    }

Затем я могу получить BookList () в том же порядке, который я вставил при сохранении в БД. Когда мы не указываем имя столбца, например @ OrderBy ("xxxColumn") , по умолчанию используется первичный ключ этого объекта. В моем случае он использует instanceId объекта Book, который всегда будет следовать тому же порядку, что и порядок вставки, поэтому он удовлетворит мои потребности.

Однако мне любопытно, почему заказ был обратным в первую очередь.

2 голосов
/ 25 июня 2009

Я думаю, что нет возможности добиться этого напрямую с помощью списков. Мы на работе используем следующее:

Если вы хотите предоставить своему пользователю полный контроль над порядком сущностей, вам следует добавить новое поле, например:

@Entity
public class Todo {
  @Id private Long id;
  private int position; 
  // + public setter/getter 
} 

@Entity
public class Todos {
  @Id private id;

  @OneToMany
  private List<Todo> todos = new LinkedList<Todo>();
  // + public setter/getter     
}

, а затем разместите порядок по позициям во всех запросах или реализуйте Comparator для Todos и используйте Collections.sort (List lst, Comparator cmp) для сортировки списка в памяти.

public class TodoComparator implements Comparator {
  public int compare(Object o1, Object o2) {
    Todo t1 = (Todo)o1;
    Todo t2 = (Todo)o2;
    return t2.getPosition() - t1.getPosition();
  }
}

Collection.sort (задачи, новый TodosComparator ());

после того, как ваш пользователь завершит переупорядочение списка, (перед сохранением) перенумеруйте список:

for(int pos=0; pos < todos.size(); pos++ )
    todos.get(pos).setPosition(pos);

и сохранение задач. И наслаждайтесь полным контролем.

2 голосов
/ 24 июня 2009

Использует ли ваш слой Hibernate наборы? Я считаю, что по умолчанию. Заданный интерфейс (и его конкретные реализации) не поддерживают порядок вставки.

В качестве альтернативы, вы можете посмотреть на ваши запросы, используете ли вы «заказ по»?

Я бы также попытался просмотреть коллекцию в памяти с помощью отладчика. Ваш код просмотра может быть переупорядочен по Коллекции. По крайней мере, отладчик будет полезен, чтобы увидеть, в какой момент ваша коллекция обращена вспять.

0 голосов
/ 03 июля 2009

Вы работаете непосредственно в списке?

object.getItems().add/remove/set ...

Попробуйте вместо этого сделать копию

List items = new ArrayList(object.getItems());

затем оперируем, затем устанавливаем полную коллекцию за один снимок:

object.setItems(items)
0 голосов
/ 23 июня 2009

Вы реализовали сравнение для этой иерархии объектов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...