2013-08-20 1 views
0

У меня это отношение отображается, например.Hibernate ManyToOne и OneToMany

@Entity 
@Table(name = "shop") 
public class Shop implements Serializable { 

    ... 

    @OneToMany(mappedBy = "shop", fetch=FetchType.LAZY) 
    private Set<Event> events; 

    ... 

} 

@Entity 
@Table(name = "event") 
public class Event implements Serializable { 

    ... 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "shop_id", nullable = false) 
    private Shop shop; 

    ... 

} 

Когда Local GetEvent() вызываются загружено в полуботинках один список с несколькими событиями, но каждое событие есть в другом магазине может иметь внутри другого события и последовательно .. Это нормально ?. Может ли какая-либо проблема реагировать на структуру JSON?

+1

Не совсем понятно, что вы просите. Если речь идет о том, будут ли определять обе стороны отношений, будут возникать проблемы с такими вещами, как круговые/бесконечные зависимости, тогда нет, не беспокойтесь. Сериализация ваших объектов в JSON тоже не должна быть проблемой, хотя, конечно, вам нужно будет написать код сериализации самостоятельно. – aroth

+0

Я использую MappingJackson2JsonView, чтобы решить любую проблему? – Dani

+0

@Dani С нетерпением ждем, есть ли проблема с производительностью при ее использовании .. ?? – Dileep

ответ

2

Я имел проблемы во время сериализации JSON

... 
    at org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:72) 
    at org.codehaus.jackson.map.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23) 
    at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) 
    at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) 
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) 
    at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) 
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) 
... 

Чтобы решить эту проблему, я использовал @JsonIgnore аннотацию в одно свойство:

@Entity 
@Table(name = "shop") 
public class Shop implements Serializable { 

    ... 

    @JsonIgnore 
    @OneToMany(mappedBy = "shop", fetch=FetchType.LAZY) 
    private Set<Event> events; 

    ... 

} 

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

+0

Спасибо @paulek, отлично подходит для меня, у меня есть только один вопрос, мне не нужно сериализовать это поле, но мне нужно его несериализовать. Тогда я думаю, что я должен положить JsonIgnore в getter, но не в сеттер, конечно? – Dani

+0

@ Dani Точно, как вы сказали. – paulek

1

Hibernate проверяет данные с идентификацией полученных данных и хранится в одном объекте. В этом спящем режиме определяются данные, которые нужно извлечь, и извлекает только требуемые данные. При этом нагрузка будет минимальной.

Но если вам не нужны какие-либо другие детали, лучше извлечь данные, не используя этот класс Entity с отношениями в нем. Потому что он просто покупает слишком много данных. Вы можете использовать это как хороший выбор.

Для примера Если вам просто нужно указать имя сотрудника из сотрудника таблицы для идентификатора в таблице платежей, то вы можете использовать класс VO и выбирать только те значения, которые вам нужны ,

Выполните шаги

  1. Создать новый класс (не класс объектов отображается в таблице)
  2. Объявляем переменные для каждого столбца вы должны принести с того же типа, как тип столбца и создать геттеры и сеттеры.
  3. Создайте конструктор с полями в качестве аргументов в том же порядке, что и для запроса запроса.
  4. выполнить запрос (можно также использовать внутреннее соединение)

    выберите A.Col1, A.Col2, A.Col3, B.Col1, B.Col2 из Table1 A, B, где Table2 A.RelationId = B.ID;

    - это соотношение между двумя таблицами.

Вы получите объект класса voClassName со значениями, которые вам нужны.

См. section 21.1 of "Improving Performance" в справочном руководстве для получения более подробной информации о повышении эффективности использования отношений и сопоставления.