Как добавить ограничение для загрузки только желаемых полей из объекта? Таблица My User с таблицей отображения CustomerUser OneToOne и таблицей транзакций, имеющей пользовательскую привязку OneToOne Итак, когда я загружаю транзакцию, она загружает пользователя и соответствующего клиента, но я не хочу загружать пароль и некоторые другие файлы из таблицы customeruser. (Hibernate версия 4.2.6)Hibernate- Fields Lazy Fetching
ответ
Вы можете сделать это с
@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.
Но теперь мой проект становится настолько обширным, что я не могу даже коснуться моего дизайна pojo. CustomerUser используется во многих функциях .. –
Но ваше предложение прохладно –
Насколько я знаю, нет другого пути с Hibernate, чем эти два. – hakamairi
Что вам нужно сделать, это написать 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
}
Интересно, поэтому вы перевернули таблицы, чтобы ответить на вопрос о сериализации вместо вопроса о сопоставлении. – hakamairi
Он хочет использовать Lazy load и загружает транзакцию в формате json. Я объяснил картографирование и сериализацию –
Конечно, вы правы, и да, это будет подходящий подход, если вы проигнорируете часть ленивых полей вопроса и предположите, что достаточно просто исключить его в сериализации. Но вопрос заключается в том, как не загружать его, а не как не сериализовать его. – hakamairi
Вы загружаете транзакцию в json? –
yes, im fetching json data –