2017-01-16 7 views
0

Как добавить ограничение для загрузки только желаемых полей из объекта? Таблица My User с таблицей отображения CustomerUser OneToOne и таблицей транзакций, имеющей пользовательскую привязку OneToOne Итак, когда я загружаю транзакцию, она загружает пользователя и соответствующего клиента, но я не хочу загружать пароль и некоторые другие файлы из таблицы customeruser. (Hibernate версия 4.2.6)Hibernate- Fields Lazy Fetching

+0

Вы загружаете транзакцию в json? –

+0

yes, im fetching json data –

ответ

1

Вы можете сделать это с

@Basic(fetch = FetchType.LAZY) 

Но для того, чтобы работать на своих полях необходимо включить зимует Bytecode Enhancer (some back story)

 <plugin> 
      <groupId>org.hibernate.orm.tooling</groupId> 
      <artifactId>hibernate-enhance-maven-plugin</artifactId> 
      <version>${hibernate.version}</version> 
      <executions> 
       <execution> 
        <configuration> 
         <failOnError>true</failOnError> 
         <enableLazyInitialization>true</enableLazyInitialization> 
         <enableDirtyTracking>true</enableDirtyTracking> 
        </configuration> 
        <phase>compile</phase> 
        <goals> 
         <goal>enhance</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

другой путь должен состоять из двух объектов, сопоставленных с одной таблицей. Подобно CustomerUser мог отображать все поля, которые всегда загружаются, но у CustomerPassword будет только идентификатор и сам пароль. Тогда вы будете загружать только объект паролей, когда вам это нужно, из вашего сервиса/репозитория.

Это было распространенное обходное решение, прежде чем они установили ленивый билет на недвижимость. Взято, как 3 года: P.

+0

Но теперь мой проект становится настолько обширным, что я не могу даже коснуться моего дизайна pojo. CustomerUser используется во многих функциях .. –

+0

Но ваше предложение прохладно –

+0

Насколько я знаю, нет другого пути с Hibernate, чем эти два. – hakamairi

1

Что вам нужно сделать, это написать Json-аннотацию и тип выборки. например:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) 
@JsonIgnore 
private CustomerUser customerUser; 

FetchType.LAZY не загружает класс автоматически. @JsonIgnore блокирует класс, который находится в json.

Или

Допустим, вы хотите загрузить CustomerUser со всеми переменными, кроме пароля. Что вам нужно сделать, так это добавить @JsonIgnore в переменную пароля.

public class User { 
     .... 
     @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) 
     @JsonManagedReference 
     private CustomerUser customerUser; 
     .... 
} 

public class CustomerUser { 

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

     @Column(name = "password") 
     @JsonIgnore 
     private String password; 
     ...... 
     ...getters/setters 
} 
+0

Интересно, поэтому вы перевернули таблицы, чтобы ответить на вопрос о сериализации вместо вопроса о сопоставлении. – hakamairi

+0

Он хочет использовать Lazy load и загружает транзакцию в формате json. Я объяснил картографирование и сериализацию –

+0

Конечно, вы правы, и да, это будет подходящий подход, если вы проигнорируете часть ленивых полей вопроса и предположите, что достаточно просто исключить его в сериализации. Но вопрос заключается в том, как не загружать его, а не как не сериализовать его. – hakamairi

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

  • Нет связанных вопросов^_^