首页 > Berkeley DB JE, Chao Huang, 程序设计 > Berkeley DB Java版直接持久层基础

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

  1. 徐明松
    2009年10月9日09:59 | #1

    实现关系映射的时候中@persistent和@entity它们两的区别是什么??

  2. taozhang
    2009年10月9日11:40 | #2

    @Entity标注的是一条记录,而@Persistnt标注的是一个字段,具体请参看以下两个链接:
    Entity
    Persistent

  3. 徐明松
    2009年10月9日16:39 | #3

    谢谢你的回答.
    下面是我在写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);

    请你帮我解释一下,非常谢谢!!!

  4. chaohuang
    2009年10月9日17:24 | #4

    @徐明松
    从代码上我看不出太大问题。我的建议是:你尽量使用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下。

  5. 徐明松
    2009年10月9日18:01 | #5

    bdb存储数据时可以用级联不??????

  6. chaohuang
    2009年10月9日18:20 | #6

    @徐明松
    你所谓的级联是什么意思?是指外键的级联删除吗?BDB和BDB-JE都支持外键级联删除。

  7. 徐明松
    2009年10月10日17:05 | #7

    我用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
    这是什么原因??????
    非常谢谢你的回答!!!!

  8. chaohuang
    2009年10月12日12:53 | #8

    @徐明松
    原因:你open database的时候,指定了事物 – transaction;但是使用EntityCursor没有指定事物设置。
    解决办法:使用paccessor.personByPId.entities(Transaction txn, CursorConfig config)方法来替换原来的。

  9. 徐明松
    2009年10月13日09:08 | #9

    我修改了还是报:
    Transaction not specified for a transactional database错误

  10. chaohuang
    2009年10月13日11:32 | #10

    @徐明松
    请仔细读一下JE的Get Started Guide 和实例代码,我相信你可以自己解决的。

    或者,你干脆不要事物:env.setTxnal(false), db.setTxnal(false); – 具体请查Javadoc。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。
Դ