LinkedList与Java中的序列化

时间:2010-12-17 14:10:47

标签: java mysql serialization linked-list

我正在介绍序列化,并在与LinkedList

配对时遇到一些问题

考虑我有下表:

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来管理这些对象..

我已经能够实施LoadFromTable()StoreIntoTable(Class1 obj1)。 我的问题是 - 如果我在Class2中更改LinkedList<Class2>对象的属性,如何影响此单个项目的数据库更改?还要考虑LinkedList中元素的顺序可能会发生变化..

谢谢:)

*编辑 是的,我知道我必须删除/更新我的数据库表中的一行。但是我如何跟踪要更新的WHICH行?我只是将对象存储在List中,而不是表中的各自ID。

5 个答案:

答案 0 :(得分:1)

您必须将ID存储在您正在存储的对象中。但是,我建议不要尝试使用自己的ORM系统,而是使用像Hibernate这样的东西。

答案 1 :(得分:0)

如果更改对象中的属性或项目的顺序。您将不得不删除该行并再次插入更新的列表。

答案 2 :(得分:0)

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

我希望我能帮到你。 SQL update和delete语句允许您添加一个WHERE子句,您可以在其中选择要更新的行的ID。

e.g。

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

编辑:

为了防止你的ID问题你可以包裹你的对象

class Wrapper {
   int  dbId;
   Object obj;
}

将它们而不是'naked'对象添加到LinkedList

答案 3 :(得分:0)

您可以对表使用AUTO_INCREMENT attribute,然后使用mysql_insert_id()函数检索分配给上一个INSERT / UPDATE语句添加/更新的行的ID。与此一起维护从java对象到Id的映射(例如HashMap)。使用此地图,您可以跟踪要删除/更新的行。

修改:同时查看this question的答案。

答案 4 :(得分:0)

我认为这里真正的问题是,你混合和匹配不同的抽象层次。通过将序列化的Java对象作为BLOB存储到关系数据库中,您必须考虑几个缺点:

  • 您失去了互操作性。用Java以外的其他语言编写的应用程序无法读取数据。甚至其他Java应用程序也必须在其类路径中包含序列化类的类文件。
  • 更改存储类的类定义将最终导致维护噩梦。
  • 您放弃了关系数据库的优势。序列化隐藏了数据库中的实际数据。所以数据库只显示一个黑盒子。您无法对真实数据执行任何有意义的查询。所有你拥有的是ID和字节块。
  • 您必须自己实施低级别的数据处理。实际上,数据库是为了有效地处理您的数据,但由于序列化,您阻碍了它的工作。所以你是独立的,你现在遇到了这个问题。

因此,在大多数情况下,您可以从separation of concerns获益并使用正确的工具来完成工作。

以下是一些建议:

将应用程序内部的内部数据处理与持久存储分开。设计数据库模式的方式是使内置数据库功能能够有效地处理数据。对于像MySQL这样的关系数据库,您可以选择不同的技术,如纯JDBC,像JPA这样的对象关系映射器或像MyBatis这样的简单映射器。这里的分离意味着避免因实现特定问题而污染数据库。

例如,如果您在Java应用程序中有一个Person实例列表,每个Person都包含一个名称和一个年龄。然后,您将在关系数据库中将该列表表示为一个表,该表包含名称的VARCHAR字段和年龄的数字字段,以及可能是唯一键的第三个字段。然后数据库能够做到最好:管理大量数据。

在应用程序内部,您通常将持久层与包含代码的程序的其余部分分开,以与数据库进行通信。

在某些用例中,关系数据库可能不是合适的工具。也许在具有少量数据的单个用户桌面应用程序中,最好将您的Person列表序列化为普通文件并在下次启动时将其读回。

但是还有其他替代方法可以保留您的数据。也许某种面向对象的数据库是正确的工具。特别是我有快速对象的经验。作为简化,它是类固醇的序列化。在您的应用程序和数据库之间不需要像JPA或JDBC这样的层。您可以将类实例直接存储到数据库中。但与具有BLOB字段的关系数据库不同,OODB知道您的类和实际数据,并且可以从中受益。

另一种选择可能是JDBMBerkeley DB

因此,关注点的分离和选择正确的持久性策略(并以正确的方式使用它)是项目成功的关键问题。但即使对于有经验的开发人员来说,做正确也很难