2010-11-22 3 views
13

Сохраняет ли hibernate заказ LinkedHashSet, и если да, то как? Если это зависит от типа базы данных, я бы хотел знать это для PostgreSQL.Сохраняет ли hibernate заказ LinkedHashSet, и если да, то как?

фона:

Я знаю, что LinkedHashSet для, и причина, почему я спрашиваю это потому, что я регистрируя имена некоторых функций я выполняю к столу «LogError», который имеет отношение «многие ко многим» к некоторой таблице «functionName». Мне нужно, чтобы эти функции оставались в том же порядке, что и при выполнении их, поэтому сначала я нахожу соответствующие объекты «functionName», помещаю их в LinkedHashSet (после каждой неудавшейся функции), а затем я сохраняю объект «logError».

Теперь, когда я снова получаю объект «logError» из базы данных, будет ли он еще упорядочен? И если так, мне было любопытно, как это делается спящим.

+1

Вы пробовали аннотировать с помощью @OrderColumn? (возможно, это аннотация JPA) – willcodejavaforfood

ответ

13

Во-первых: Я предполагаю, что вы говорите об отношениях между двумя сущностями. Что-то вроде

@Entity 
public class A { 
@ManyToMany 
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") }) 
    private Set<B> bSet = new LinkedHashSet<B>(); 
} 

Hibernate не сохраняет порядок сам по себе!

Если вы посмотрите на классах, используемых при объекте A загружаются из базы данных, то SetbSet имеет типа PersistentSet, который является оболочкой вокруг другого Set, и это (в моем случае) нормальное HashSet. (HashSet не сохраняет порядок ее элементов.)

Даже если Hibernate используется List или LinkedHashSet, он по-прежнему нецелесообразно основывать реализацию на естественном порядке базы данных (не гарантировано). Для MySQL это своего рода анти-шаблон.

Но вы можете использовать аннотацию @Sort (org.hibernate.annotations.Sort), чтобы сделать вашу сортировку явной. Например:

@OneToMany(mappedBy = "as") 
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class); 
public SortedSet<C> cs; 

@see: Ordering return of Child objects in JPA query


Добавил Лукаш Rzeszotarski на 1-го сентября 2012:

Но мы должны помнить, что использование @Sort аннотацию вызывает сортировочные объекты памяти (jvm), а не в sql. Вместо этого мы можем использовать аннотацию @OrderBy, которая вызывает сортировку на стороне сервера sql. Обе эти аннотации имеют в моем (Łukasz Rzeszotarski) мнение одну слабость, которая настроила порядок по умолчанию. Я (Łukasz Rzeszotarski) предпочитает спящий режим, используя собственную реализацию LinkedHashSet, когда он «видит» этот порядок order by.

@see: Hibernate ordering in sql

+3

@ Łukasz Rzeszotarski: если вы отредактируете сообщение someones снова таким образом, тогда сделайте хотя бы ясно, что это было ваше заявление, а не оригинальные авторы! – Ralph

+0

Это глупый ответ, если у вас действительно есть нормальная карта, а не сущность, и вы просто хотите сохранить заказ через 'LinkedHashMap' – Enerccio

+0

@Enerccio: вопрос о том, как хранить hibernate (или нет) в списке LinkedHashSet, это а не о том, хотите ли вы, чтобы они хранили карту. Если вы считаете, что мой ответ неправильный (может быть, это так), тогда, пожалуйста, напишите правильный правильный ответ, и я делюте свой и повышу ваш. – Ralph

0

Наборы не имеют неотъемлемого «заказа», а также таблицы базы данных - вы можете применять заказ при запросе данных, но если вы не сохраните этот порядок (например, путем получения строк один за другим и помещения их в упорядоченный контейнер, как связанный список), то возвращенные данные также будут неупорядочены.

+1

LinkedHashSet имеет порядок вставки – willcodejavaforfood

0

Когда мне нужно упорствовать порядок в списке элементов, я использую Map и не List.

@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL) 
@MapKey(name = "position") 
private Map<Integer, RuleAction> actions    = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this })); 

В этом примере Java, position это свойство Целое RuleAction поэтому порядок сохраняется таким образом. Думаю, в C# это выглядело бы довольно похоже.

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