Hibernate OGM

Hibernate OGM 入门

Hibernate OGM 已经不再维护。

如果您熟悉 JPA,那么您几乎可以立即开始使用。我们将带您逐步完成使用 Hibernate OGM 持久化和检索实体的最初几个步骤。

工具配置

在开始之前,请确保您已配置以下工具

  • Java JDK 8

  • Maven 3.x

Hibernate OGM 也可与 JDK 7 一起使用,但在此示例中,我们将使用 Infinispan 8,它需要 JDK 8。

Hibernate OGM 发布在 Maven 中央仓库中。

org.hibernate.ogm:hibernate-ogm-bom:5.4.1.Final 添加到您的依赖管理块中,并将 org.hibernate.ogm:hibernate-ogm-infinispan:5.4.1.Final 添加到您的项目依赖项中

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.hibernate.ogm</groupId>
            <artifactId>hibernate-ogm-bom</artifactId>
            <version>5.4.1.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
<dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.hibernate.ogm</groupId>
        <artifactId>hibernate-ogm-infinispan</artifactId>
    </dependency>
</dependencies>

前者是一个所谓的“物料清单” POM,它指定了 Hibernate OGM 及其依赖项的匹配版本集。这样,您就不需要在依赖项块中显式指定版本,而是会自动从 BOM 获取版本。

如果您将应用程序部署到 WildFly 10 上,则无需将 Hibernate OGM 模块添加到您的部署单元中,而是可以将它们作为模块添加到应用程序服务器中。

教程

我们将在本教程中使用 JPA API。虽然 Hibernate OGM 依赖于 JPA 2.1,但在 Maven POM 文件中标记为已提供。如果您在 Java EE 容器之外运行,请确保显式添加依赖项

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
</dependency>

现在让我们映射第一个 Hibernate OGM 实体。

@Entity
public class Dog {
   @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog")
   @TableGenerator(
      name = "dog",
      table = "sequences",
      pkColumnName = "key",
      pkColumnValue = "dog",
      valueColumnName = "seed"
   )
   public Long getId() { return id; }
   public void setId(Long id) { this.id = id; }
   private Long id;

   public String getName() { return name; }
   public void setName(String name) { this.name = name; }
   private String name;

   @ManyToOne
   public Breed getBreed() { return breed; }
   public void setBreed(Breed breed) { this.breed = breed; }
   private Breed breed;
}

@Entity
public class Breed {

   @Id @GeneratedValue(generator = "uuid")
   @GenericGenerator(name="uuid", strategy="uuid2")
   public String getId() { return id; }
   public void setId(String id) { this.id = id; }
   private String id;

   public String getName() { return name; }
   public void setName(String name) { this.name = name; }
   private String name;
}

我骗了你,我们已经映射了两个实体!

如果您熟悉 JPA,您可以看到我们的映射中没有特定于 Hibernate OGM 的内容。

在本教程中,我们将使用 JBoss Transactions 作为我们的 JTA 事务管理器。因此,让我们将 JTA API 和 JBoss Transactions 也添加到我们的 POM 中。最终的依赖项列表应如下所示

<dependencies>
    <!-- Hibernate OGM Infinispan module; pulls in the OGM core module -->
    <dependency>
        <groupId>org.hibernate.ogm</groupId>
        <artifactId>hibernate-ogm-infinispan</artifactId>
    </dependency>

    <!-- standard APIs dependencies - provided in a Java EE container -->
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jboss.spec.javax.transaction</groupId>
        <artifactId>jboss-transaction-api_1.2_spec</artifactId>
    </dependency>

    <!-- Add the Narayana Transactions Manager
         an implementation would be provided in a Java EE container,
         but this works nicely in Java SE as well -->
    <dependency>
        <groupId>org.jboss.narayana.jta</groupId>
        <artifactId>narayana-jta</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jboss</groupId>
        <artifactId>jboss-transaction-spi</artifactId>
    </dependency>
</dependencies>

接下来,我们需要定义持久化单元。创建一个 META-INF/persistence.xml 文件。

<?xml version="1.0"?>
<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="ogm-jpa-tutorial" transaction-type="JTA">
        <!-- Use the Hibernate OGM provider: configuration will be transparent -->
        <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
        <properties>
            <!-- Here you will pick which NoSQL technology to use, and configure it;
                 in this example we start a local in-memory Infinispan node. -->
            <property name="hibernate.ogm.datastore.provider" value="infinispan"/>
        </properties>
    </persistence-unit>
</persistence>

现在让我们持久化一组实体并检索它们。

//accessing JBoss's Transaction can be done differently but this one works nicely
TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();

//build the EntityManagerFactory as you would build in in Hibernate ORM
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
    "ogm-jpa-tutorial");

final Logger logger = LoggerFactory.getLogger(DogBreedRunner.class);

[..]

//Persist entities the way you are used to in plain JPA
tm.begin();
logger.infof("About to store dog and breed");
EntityManager em = emf.createEntityManager();
Breed collie = new Breed();
collie.setName("Collie");
em.persist(collie);
Dog dina = new Dog();
dina.setName("Dina");
dina.setBreed(collie);
em.persist(dina);
Long dinaId = dina.getId();
em.flush();
em.close();
tm.commit();

[..]

//Retrieve your entities the way you are used to in plain JPA
tm.begin();
logger.infof("About to retrieve dog and breed");
em = emf.createEntityManager();
dina = em.find(Dog.class, dinaId);
logger.infof("Found dog %s of breed %s", dina.getName(), dina.getBreed().getName());
em.flush();
em.close();
tm.commit();

[..]

emf.close();

您可以在 Hibernate OGM 的源代码中找到一个工作示例,位于 documentation/examples/gettingstarted 下。从 GitHub 代码库 查看源代码!

我们看到了什么?

  • Hibernate OGM 是一个 JPA 实现,在映射和 API 使用中都以这种方式使用。

  • 它被配置为一个特定的 JPA 提供程序:org.hibernate.ogm.jpa.HibernateOgmPersistence

要了解有关 Hibernate OGM 及其支持的所有 NoSQL 技术的更多信息,请参阅 参考文档

返回顶部