Вопрос по jpa, java, lazy-loading, hibernate, one-to-many – JPA Hibernate хочет ленивую загрузку, чтобы вернуть пустую коллекцию

1

В настоящее время я использую JPA-Hibernate и хочу, чтобы коллекции были пустыми, пока я не вызову связанный метод get (). Я пытался в течение нескольких дней без какого-либо успеха. Причина, по которой я этого хочу, заключается в том, что я использую Exterialize (или Serialize) и не всегда хочу, чтобы коллекции были там при отправке сериализованной строки клиенту.

@Entity
public class Thread implements Externalizable {
    static final long serialVersionUID = 9L;


@OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY)
    @LazyCollection(LazyCollectionOption.EXTRA)
    public Collection getReplies() {
        return replies;
    }

А вот модель ответа:

@Entity
public class Reply implements Externalizable {
    static final long serialVersionUID = 8L;

    @ManyToOne
    @JoinColumn(name = "threadId", referencedColumnName = "id", nullable = false)
    public Thread getParentThread() {
        return parentThread;
    }

Этот код - то, что я использую для сериализации модели:

public static final String serialize(Serializable object) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream( baos );
    oos.writeObject( object );
    oos.close();
    BASE64Encoder base64Encoder =  new BASE64Encoder();
    return  new String( base64Encoder.encode(baos.toByteArray()));
}

Это то, что я использую, чтобы найти объекты потока

models.Thread thread = em.find(models.Thread.class, threadId);

Если я использую entityManager.find () или запрос, он все равно загружает список ответов. Чтобы быть более ясным, я хотел бы, чтобы коллекция была пустой, когда я генерирую сущность. Затем, если я вызову get (), я бы хотел, чтобы он заполнился.

На следующем рисунке показано, что ответы хранятся в списке. Они не содержат никаких значений, что, как я полагаю, связано с тем, что отложенная загрузка означает, что они являются прокси-объектами, которые на самом деле не были извлечены из базы данных? Пожалуйста, поправьте, если я ошибаюсь. В качестве примечания, если возможно сохранить список в виде массива или другой стандартной реализации списка, это было бы здорово. Я понимаю, что JPA хочет использовать нотацию persistentBag / persistentSet, так как они могут иметь дублирующиеся значения, которые стандартная реализация не допускает, и, возможно, некоторые другие причины. Но для сериализации модели с клиентом было бы замечательно не нуждаться в библиотеках, и они также, кажется, не работают с android, потому что SSID, кажется, изменяется в библиотеках при использовании android.

Я действительно надеюсь, что это возможно. Спасибо заранее!

Здравствуйте! Я заполнил вопрос дополнительной информацией. Я на 100% уверен, что это в find (), так как, когда я тестирую, я использую отладчик, чтобы остановить и проверить содержимое сразу после вызова find (). Даже при том, что я отправил свою сериализацию "механизм" для вас, если бы это могло как-то помочь. Я сделал обходной путь, который должен работать, пока коллекция загружается лениво, которые по какой-то причине не работают. Вот ссылка на этот вопрос, если этот вопрос более разрешимый:stackoverflow.com/questions/16294572/... Mathias Lindblom
какой механизм вы используете для сериализации сущностей, которые вы отправляете по проводам, вы уверены, что они извлекаются во время вызова find или это может быть во время сериализации. cproinger
Возможно ли, что отладчик вызвал загрузку коллекции, когда хотел отобразить ее размер? Более надежным способом было бы сделать тест, когда вы ничего не сериализуете и не отслеживаете следы запросов в базе данных. Ленивая загрузка не является обязательной в соответствии со спецификацией JPA, но я протестировал ее в Hibernate, и она работает, в Eclipselink работает только при включенном ткачестве времени загрузки. German

Ваш Ответ

1   ответ
0

я наткнулся на этот блог:https://sites.google.com/a/pintailconsultingllc.com/java/hibernate-extra-lazy-collection-fetchingi»

я не уверен, что LazyCollectionOption.EXTRA подходит вам в этом сценарии, включите запись в sql, чтобы увидеть, какие запросы действительно выполняются hibernateвы аннотировали сборщик коллекций, так что это может быть применимо для вас (из ссылочного блога)Если класс org.hibernate.collection.PersistentBag, вы 'Вы используете семантику сумок, и теперь коллекция будет загружать все элементы при первом касании любого элемента в списке.я бы неt Используйте ObjectOutputStream в сценариях, где возможно, что клиент и сервер обновляются в разное время (версия класса Android или версия класса сервера). Вы избавите себя от множества проблем такого рода, если сериализуете в xml или json. Например, с xstream (не используйте сериализацию xstream-xml по умолчанию, хотя, поскольку она содержит полное имя класса, используйте псевдонимы), вы можете указать сериализатору, какие поля следует игнорировать, с помощью аннотации или пояснения перед сериализацией.

Похожие вопросы