Berkeley DB Java版直接持久层基础
Berkeley DB Java版直接持久层基础
概览
Berkeley DB Java 版是一套纯Java语言实现的嵌入式数据库。它提供的事务存储引擎不仅显著的减少了对象持久化开销,而且保持了对象-关系映射(ORM)解决方案的灵活性,速度和扩展性。Berkeley DB Java版3.0引入了直接持久层(DPL),旨在提供和与企业 Java Bean 3.0 (EJB3) 持久性相同好处:对象持久化时,不需要将对象转换成关系表。
更多请参见我在OTN上完整的中文翻译:http://www.oracle.com/technology/global/cn/products/berkeley-db/pdf/bdb-je-persistence-api-basics.pdf
英文原文:http://www.oracle.com/database/docs/BDB-JE-DPL-Basics-Whitepaper.pdf
实现关系映射的时候中@persistent和@entity它们两的区别是什么??
@Entity标注的是一条记录,而@Persistnt标注的是一个字段,具体请参看以下两个链接:
Entity,
Persistent。
谢谢你的回答.
下面是我在写one-one时出现的问题:
代码如下:
人类:
@Entity
public class Person {
@PrimaryKey
int pid;
@SecondaryKey(relate=Relationship.MANY_TO_ONE)
String pname;
@SecondaryKey(relate=Relationship.ONE_TO_ONE,relatedEntity=Idcard.class,onRelatedEntityDelete=DeleteAction.CASCADE)
int id;
public Person(){}
public Person(int pid,String name,int id){
this.pid=pid;
this.pname=name;
this.id=id;
}
}
身份证类:
@Entity
public class Idcard {
@PrimaryKey
int id;
@SecondaryKey(relate=Relationship.ONE_TO_ONE)
String idcard;
public Idcard(){}
public Idcard(int id,String idcard){
this.id=id;
this.idcard=idcard;
}
}
上面是我的代码,在插入数据之后我想对人的姓名进行修改时,虽然不会报什么错但是它始终处于运行状态,下次读取数据的时候就读不到了。
修改的代码如下:
Person person=paccessor.personByPId.get(4);
person.pname=”berkeley”;
paccessor.personByPId.putNoReturn(person);
//这里得不到数据了
System.out.println(paccessor.personByPId.get(4).pname);
还有就是:
在删除信息时,也会出现上面的问题,删除代码如下:
paccessor.personByPId.delete(2);
请你帮我解释一下,非常谢谢!!!
@徐明松
从代码上我看不出太大问题。我的建议是:你尽量使用Cursor(如EntityCursor等)来做读取、插入、修改和删除操作。如果你的程序始终处于运行状态,你可以做一个thread dump并发来看看 – /bin/jstack pid.
另可参考http://www.bdbchina.com/2009/02/%E5%9C%A8berkeley-db-java%E7%89%88%E4%B8%AD%E5%AE%9E%E7%8E%B0sql%E6%9F%A5%E8%AF%A2/。其中的例子程序在/example/persist/sqlapp下。
bdb存储数据时可以用级联不??????
@徐明松
你所谓的级联是什么意思?是指外键的级联删除吗?BDB和BDB-JE都支持外键级联删除。
我用EntityCursor来修改和删除数据的主要代码如下:
EntityCursor ec=paccessor.personByPId.entities();
ec=paccessor.personByPId.entities();
for(Person p:ec){
if(p.pid==4){
p.pname=p.pname.toUpperCase();
ec.update(p);
ec.delete();
}
}
程序给我报了:Transaction not specified for a transactional database
这是什么原因??????
非常谢谢你的回答!!!!
@徐明松
原因:你open database的时候,指定了事物 – transaction;但是使用EntityCursor没有指定事物设置。
解决办法:使用paccessor.personByPId.entities(Transaction txn, CursorConfig config)方法来替换原来的。
我修改了还是报:
Transaction not specified for a transactional database错误
@徐明松
请仔细读一下JE的Get Started Guide 和实例代码,我相信你可以自己解决的。
或者,你干脆不要事物:env.setTxnal(false), db.setTxnal(false); – 具体请查Javadoc。