【问题标题】:using hibernate with embedded derby使用带有嵌入式 derby 的休眠
【发布时间】:2012-01-17 13:25:56
【问题描述】:

我想在独立应用程序中使用hibernate嵌入式德比,我有一些问题:

  1. 我需要什么罐子?
  2. 什么是必要的休眠配置?
  3. 还有其他必要的配置吗?
  4. 查询/标准是否有任何问题/限制?

如果您还可以为我推荐一些关于这种方法的好教程,那将是更可取的,在此先感谢。

【问题讨论】:

    标签: hibernate maven derby


    【解决方案1】:

    我使用 Apache Derby 和 Hibernate 来测试我项目的模型类之一(它们的 equalshashCode 实现、查询等)。 MySQL 用作生产数据库。我选择 Derby 而不是 HSQLDB,因为我遇到了 Hibernate 和 HSQLDB 的一些不兼容问题,这意味着,考虑到我的实体(它们的名称、模式、键)及其关系 Hibernate 无法在 HSQLDB 中创建我的数据库模式,而它可以与德比。也就是说,也许我搞砸了;也可以解决不兼容问题。

    无论如何,这是我在测试中使用的(我已经修改了我的 pom.xml,以便它将 Derby 作为 runtime 依赖项包含并运行单个测试,以确保它是工作)。

    pom.xml

    <dependencies>                                      
      ...                               
      <dependency>                                      
        <groupId>org.hibernate</groupId>                
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.6.8.Final</version>                  
      </dependency>                                     
      <dependency>                                      
        <groupId>org.apache.derby</groupId>             
        <artifactId>derby</artifactId>                  
        <version>10.8.2.2</version>                     
        <scope>runtime</scope>                          
      </dependency>                                     
      <!-- 
         an slf4j implementation is needed by
         hibernate so that it could log its *stuff*
      -->
      <dependency>                                      
        <groupId>org.slf4j</groupId>                    
        <artifactId>slf4j-simple</artifactId>           
        <version>1.6.4</version>                        
        <scope>runtime</scope>                          
      </dependency>                                     
      ...                             
    </dependencies>                                     
    

    persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
      version="2.0">
      <persistence-unit name="test">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>Test</class>
        <properties>
          <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
          <!--
            if you don't have a database already created
            append ;create=true to end of the jdbc url
          -->
          <property name="javax.persistence.jdbc.url" value="jdbc:derby:test"/>
          <property name="javax.persistence.jdbc.user" value="root"/>
          <property name="javax.persistence.jdbc.password" value="root"/>
          <!--  
            if you just created the database, maybe
            you want hibernate to create a schema for you
    
            <property name="hibernate.hbm2ddl.auto" value="create"/> 
          -->
        </properties>
      </persistence-unit>
    </persistence>
    

    Test实体

    @Entity
    @Table(name = "test")
    public class Test {
    
      @Id
      public int id;
    
      @Basic
      public String data;
    }
    

    测试

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");  
    EntityManager em = emf.createEntityManager();                               
    EntityTransaction tx = em.getTransaction();                                 
    
    Test test = em.find(Test.class, 1);                                         
    if (test == null) {                                                         
      test = new Test();                                                        
      test.id = 1;                                                              
      test.data = "a";                                                          
    
      tx.begin();                                                               
      em.persist(test);                                                         
      tx.commit();                                                              
    }                                                                           
    
    System.out.format("Test{id=%s, data=%s}\n", test.id, test.data);            
    
    em.close();                                                                 
    emf.close();    
    

    【讨论】:

    • 如何创建数据库并填充表格?
    • @Msaleh 如果您使用像 jdbc:derby:test;create=true 这样的 JDBC URL,将在您第一次连接时创建数据库。如果您使用&lt;property name="hibernate.hbm2ddl.auto" value="create"/&gt;,那么 Hibernate 将创建保存您的实体所需的表。生成的模式名称、表名等都可以通过标准 Java 注释进行控制。但是,我建议您手动创建数据库和表,不要依赖 Hibernate 为您创建 good 模式。您可以使用ij 与 Apache derby 进行交互,这就像 mysql 用于 MySQL 管理数据库等。
    • 如何手工创建derby嵌入式数据库?
    • @Msaleh 使用ij,就像mysql(客户端命令行界面工具)到MySQL。 It has an extensive documentation。基本上,您启动 ij 并连接到数据库:ij&gt; connect 'jdbc:derby:&lt;path-to-db&gt;/database;create=true';create=true 告诉 ij 如果数据库不存在则创建该数据库。从那里你做你想做的事,创建表,删除它们,查询它们或其他任何东西。如果您不确定某事,我建议您参考文档,因为它写得很好且内容广泛。
    • 非常感谢这么好的答案,请用我们在 cmets 中讨论的内容更新答案。
    猜你喜欢
    • 2012-01-06
    • 2018-04-20
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2011-02-14
    • 2018-07-06
    相关资源
    最近更新 更多