2010-12-17 8 views
1

Я получаю введен в сериализации и столкнулся с некоторыми проблемами при сопряжении его с LinkedListLinkedList с сериализации в Java

Рассмотрим я иметь следующую таблицу:

CREATE TABLE JAVA_OBJECTS (
    ID BIGINT NOT NULL UNIQUE AUTO_INCREMENT, 
    OBJ_NAME VARCHAR(50), 
    OBJ_VALUE BLOB 
); 

И я планирую хранить 3 типа объектов - так что таблица может выглядеть так -

ID OBJ_NAME OBJ_VALUE 
============================ 
1 Class1  BLOB 
2 Class2  BLOB 
3 Class1  BLOB 
4 Class3  BLOB 
5 Class3  BLOB 

И я буду использовать 3 различных LinkedList «S для управления этими объектами ..

Я смог реализовать LoadFromTable() и StoreIntoTable(Class1 obj1). Мой вопрос: если я изменяю атрибут для объекта Class2 в LinkedList<Class2>, как я могу повлиять на изменение в БД для этого отдельного элемента? Также примите во внимание, что порядок элементов в LinkedList может измениться ..

спасибо:)

* EDIT Да, я понимаю, что я должен буду удалить/обновить строку в моя таблица БД. Но как я могу отслеживать WHICH строку для обновления? Я сохраняю только объекты в списке, а не их идентификаторы в таблице.

+0

У вас на самом деле есть БД? Или вы используете LinkedLists для хранения данных? – athena

+0

В Java «коллекция» сериализуема, если содержащиеся в ней классы сериализуемы. – Powerlord

+0

@athena, да - я использую mysql. – Bojack

ответ

0

Если вы изменяете атрибут в объекте или в порядке вещей. Вам придется удалить эту строку и снова вставить обновленный список.

+0

и как я могу узнать, какую строку удалить? – Bojack

+0

Наверное, я не понял часть вопроса. Почему бы вам просто не сохранить 3 списка в базе данных, а не разбить элемент списка и сохранить их отдельно. (Как вы загружаете их обратно?) – jzd

+0

Вы предлагаете сериализовать списки сами в базе данных? – Bojack

0
How do i effect the change in the DB for this individual item? 

Надеюсь, я получу вас правильно. Операторы SQL update и delete позволяют добавить предложение WHERE, в котором вы выбрали идентификатор строки для обновления.

например.

UPDATE JAVA_OBJECTS SET OBJ_NAME ="new name" WHERE ID = 2 

EDIT:

Чтобы избежать проблем с Ids вы можете обернуть вы возражаете

class Wrapper { 
    int dbId; 
    Object obj; 
} 

И добавить их вместо 'голого' объекта в вашем LinkedList

+0

Я думаю, что я был неоднозначным в формулировке - Как узнать, какой идентификатор нужно ввести? Как я уже сказал - у меня есть мои объекты в Списке, но не их соответствующие идентификаторы - что, если порядок моего списка изменяется, в какие все строки я применяю изменения? – Bojack

0

Вы можете используйте AUTO_INCREMENT attribute для своей таблицы, а затем используйте функцию mysql_insert_id() для получения идентификатора, назначенного для строки, добавленной/обновленной последним оператором INSERT/UPDATE. Наряду с этим сохраняйте карту (например, HashMap) от объекта java до Id. Используя эту карту, вы можете отслеживать, какую строку удалить или обновить.

Редактировать: См. Ответ this question.

1

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

0

Я думаю, что настоящая проблема заключается в том, что вы смешиваете и сопоставляете разные уровни абстракции.Сохраняя сериализованные объекты Java в реляционную базу данных в виде BLOB, вы должны учитывать несколько недостатков:

  • Вы потеряли интероперабельность. Приложения, написанные на других языках, кроме Java, не могут читать данные назад. Даже другие приложения Java должны иметь файлы классов сериализованных классов в своем пути к классам.
  • Изменение определений классов хранимых классов закончится в кошмарах обслуживания.
  • Вы отказываетесь от преимуществ реляционной базы данных. Сериализация скрывает фактические данные из базы данных. Таким образом, база данных представлена ​​только с черным ящиком. Вы не можете выполнить какой-либо значимый запрос против реальных данных. Все, что у вас есть, это идентификатор и блок байтов.
  • Вы должны реализовать обработку данных низкого уровня самостоятельно. Фактически база данных предназначена для эффективной обработки ваших данных, но из-за сериализации вы мешаете ей выполнять свою работу. Итак, вы сами по себе, и сейчас вы сталкиваетесь с этой проблемой.

Так что в большинстве случаев вы получаете от separation of concerns и используя подходящий инструмент для работы.

Вот некоторые предложения:

Отдельного внутренние обработка данных внутри приложения от постоянного хранения. Создайте схему базы данных таким образом, чтобы встроенные функции базы данных могли эффективно обрабатывать данные. В случае реляционной базы данных, такой как MySQL, вы можете выбирать из разных технологий, таких как простые JDBC, объектные реляционные сопоставители, такие как JPA или простые mappers, такие как MyBatis. Разделение здесь означает избегать заражения базы данных конкретными проблемами, связанными с реализацией.

Если у вас есть, например, в вашем приложении Java, экземпляры List of Person и каждое Person состоят из имени и возраста. Затем вы представляете этот список в реляционной базе данных как таблицу, состоящую из поля VARCHAR для имени и числового поля для возраста и, возможно, третьего поля для уникального ключа. Затем база данных может делать то, что она может сделать лучше всего: управление большими объемами данных.

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

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

Но существуют другие альтернативы для сохранения ваших данных. Возможно, какая-то объектно-ориентированная база данных - это правильный инструмент. В частности, у меня есть опыт работы с Fast Objects. В качестве упрощения это сериализация на стероидах. Нет необходимости использовать такой слой, как JPA или JDBC, между вашим приложением и вашей базой данных. Вы можете хранить экземпляры класса непосредственно в базе данных. Но в отличие от реляционной базы данных со своим полем BLOB, OODB знает ваши классы и фактические данные и может извлечь из этого выгоду.

Другой альтернативой может быть JDBM или Berkeley DB.

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