在j2ee中实现一般java对象数据库的方法。

04-04-22 廉价劳力
大家都知道,Hibernate, ibatis等都是用来存储“数据对象”的,你必须显示地指明每个属性对应于哪个数据库字段。

似乎并没有支持数据库存储“一般”Java对象的一个框架。在j2se中,我们用Serilizable接口来实现java对象存储到一个流,j2ee对于stateful Bean的序列化就用了这个方法。

我现在需要在自己的一个应用框架中实现这样一个功能:

1。Java对象按binary方式存储到数据库(Serializable接口),每个对象一条记录。

2。允许选择个别对象属性进行索引查询。

3。支持修改,删除,查询对象操作。

4。不需要Cache。

5。给定ClassLoader作为重新载入对象的参数。

    

flyisland
2004-04-22 14:09
我觉得“Java对象按binary方式存储到数据库”似乎和“允许选择个别对象属性进行索引查询”是冲突的。

Java对象二进制流中不会有属性信息,只需要知道class就可以了。所以给从一个Java对象二进制流是得不到属性信息的,只有这个对象的类才知道怎么还原这些信息。外部程序也就无从查询了。

为什么你需要这样的功能,可以说说需求么?

廉价劳力
2004-04-23 02:18
需求是:

我要管理一个对象集合,每个对象的Class都是运行时候决定的,专门有一个数据库管理jar文件,ClassLoader必须运行时动态创建,然后用该ClassLoader创建对象。

我要将这些对象存入对象数据库,对个别属性进行索引。所以基本的想法是用Seriliazable接口将整个对象存成Binary字段,然后对要索引的属性也建立字段。这样当然会有部分数据冗余,不过问题不大。

mustang_to
2004-04-23 02:51
well, this is supported by JDO.

In Libertor JDO, you could do the following:

1. Define a class, for example. Foo.java

2. In Foo.java, declares two fields:

String className // searchable

Object objectInstance

You could assign a serializableobject to objectInstance field. Then When you persist class Foo, JDO will persist objectInstance field as a binary blob. Also, the objectInstace field is updatable.

Of course, the instance you want to persist must implments serializable interface.

My 2 cents

廉价劳力
2004-04-23 06:25
Thanks, does JDO support to use a ClassLoader to deserialize the object? I wrote the following ObjectInputStream to use a "dynamic class loader".

class ObjectInputStreamWithLoader extends ObjectInputStream
{
	private ClassLoader loader;

	/**
	 * Loader must be non-null;
	 */

	public ObjectInputStreamWithLoader(InputStream in, ClassLoader loader)
		throws IOException {

	super(in);
	if (loader == null) {
			throw new IllegalArgumentException("Illegal null argument to ObjectInputStreamWithLoader");
	}
	this.loader = loader;
	}

	/**
	 * Make a primitive array class
	 */

	private Class primitiveType(char type) {
	switch (type) {
	case 'B': return byte.class;
		case 'C': return char.class;
	case 'D': return double.class;
	case 'F': return float.class;
	case 'I': return int.class;
	case 'J': return long.class;
	case 'S': return short.class;
	case 'Z': return boolean.class;
	default: return null;
	}
	}

	/**
	 * Use the given ClassLoader rather than using the system class
	 */
	protected Class resolveClass(ObjectStreamClass classDesc)
	throws IOException, ClassNotFoundException {

	String cname = classDesc.getName();
	if (cname.startsWith("[")) {
		// An array
		Class component;		// component class
		int dcount;			// dimension
		for (dcount=1; cname.charAt(dcount)=='['; dcount++) ;
		if (cname.charAt(dcount) == 'L') {
		component = loader.loadClass(cname.substring(dcount+1,
								 cname.length()-1));
		} else {
		if (cname.length() != dcount+1) {
			throw new ClassNotFoundException(cname);// malformed
		}
		component = primitiveType(cname.charAt(dcount));
		}
		int dim[] = new int[dcount];
		for (int i=0; i<dcount; i++) {
		dim[i]=0;
		}
		return Array.newInstance(component, dim).getClass();
	} else {
		return loader.loadClass(cname);
	}
	}
}

<p>

猜你喜欢
2Go 1 2 下一页