工具配置
在开始之前,请确保您已配置以下工具
-
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 技术的更多信息,请参阅 参考文档。