【问题标题】:Get hibernate-spatial up and running in play framework在 play 框架中启动并运行 hibernate-spatial
【发布时间】:2013-02-24 16:19:33
【问题描述】:

我正在使用 play 2.1 迈出第一步,所以我在 playframework 网站上完成了 JavaTodoList 教程。一切都按预期进行。

接下来,我将 todolist 更改为使用在我的开发盒上运行的 postgresql 数据库。我所要做的就是更改 application.conf 中的一些设置`

db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5432/todo"
db.default.user=todo
db.default.password=secretpassword

我刷新了页面,进行了数据库进化,再次一切正常。

现在我想使用 hibernate-spatial 将位置坐标存储到每个 todolist 项目(实际上可以是任何其他基于位置的项目)。

我在app/lib目录下添加了一些libraris,即:

  • hibernate-commons-annotations-4.0.1.Final.jar
  • hibernate-core-4.1.9.Final.jar
  • hibernate-spatial-4.0-M1.jar
  • jdbc-stdext-2.0.jar
  • jts-1.12.jar
  • postgis-jdbc-1.5.3.jar
  • postgresql-8.4-701.jdbc4.jar

我在经典 glassfish Java 应用程序上使用相同的库来存储空间特征,因此它们可以组合在一起。 postgresql 数据库也通过 postgis 在空间上启用,之前已使用经典的 java 应用程序进行了测试。

我将我的模型类扩展为 todo 任务如下:

package models;

import java.util.*;

import play.db.ebean.*;
import play.data.validation.Constraints.*;

import javax.persistence.*;

import com.vividsolutions.jts.geom.Point;
import org.hibernate.annotations.Type;

@Entity
public class Task extends Model {

@Id
public Long id;

@Required
public String label;

@Type(type="org.hibernate.spatial.GeometryType")
@Column(columnDefinition="Point") 
public Point location;

public static Finder<Long,Task> find = new Finder(Long.class, Task.class);

public static List<Task> all() {
    return find.all();
}

public static void create(Task task) {
    task.save();
}

public static void delete(Long id) {
    find.ref(id).delete();  
}
}

我还在我的 conf 文件中添加了 Postgis JPA 方言:

jpa.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect

Play 编译一切正常,有一些错误,当类路径中缺少库时,但我添加了上面列出的一个又一个,直到不再出现错误。然而,没有触发新位置字段的数据库演变。似乎游戏忽略了我的应用程序的所有休眠空间特定部分。它的工作方式与之前的普通 todolist 应用程序相同。

我认为这与不同的hibernate版本有关(是使用hibernate3还是hibernate4播放?我可以升级到4吗?)。有这方面经验的人能否告诉我他使用的每个库的版本以及必须完成哪些配置设置?

更新:正如 Christopher 提到的,我将 ebean 和 jpa 混为一谈。所以我把 jpa-sample 转移到我简单的 todolist 样本上。我更新了 play 项目文件和依赖项,重新连接了模型和控制器以适应 JPA EntityManager,并从类路径中删除了一些库,以便我使用 play 2.1 上的 hibernate 3。我也做了几乎就像在 jpa 示例中一样的配置,我的 persistence.xml 和 application.conf 几乎看起来一样,除了我使用 postgres 方言进行休眠。我可以编译我的项目,但是当我启动它时,我得到了

PersistenceException: [PersistenceUnit: defaultPersistenceUnit] 无法配置 EntityManagerFactory

我将 play 的详细程度配置为调试,所以我发现,在 PropertyBinder 构建我的任务实体的 id 属性之后会出现此异常。

我想我会更进一步,但看不到尽头......

【问题讨论】:

  • 从您在克里斯托弗的回答下发表的评论中,我可以看到您现在已经完全弄清楚了。您能否在新答案中分享您的模板(或至少重要的配置部分)?
  • 我现在还有一个问题。对我的实体和数据库演化进行建模非常清楚,但问题是,几何对象不会持久保存到数据库中(几何列是空的)。因为我没有时间,我还没有调试它,但我认为它只是一个小错误。当我解决这个问题后,我会将模板作为 JPA 空间示例放在 github 上。

标签: hibernate playframework-2.0 hibernate-spatial


【解决方案1】:

您似乎将 Ebean 与 JPA 混合在一起 - 它们是相互排斥的。

这是一个 JPA 示例:

https://github.com/playframework/Play20/tree/master/samples/java/computer-database-jpa

【讨论】:

  • 我认为这就是问题所在,我认为 Ebean 是 JPA 的包装器,并尝试将其配置为使用休眠空间。我没有检查所有样本,因为我不知道每个样本的意义何在。文档也让我不知道如何从 JPA 模型开始(sbt 依赖项是我仍然需要学习的另一件事)。感谢您的建议,我认为我正在继续进行这项工作。我需要一些时间来重写模型和控制器以适应 JPA,但如果我成功了,我会告诉你的......很遗憾,我喜欢 Ebean 模型实现的易用性。
  • 正如您在上面的 UPDATE 中看到的那样,我几乎复制了 jpa 示例并将其从 play 主页转移到了简单的 todolist 示例。通过这种方式,通过重新连接模型和控制器类以及所有配置文件,我学到了很多东西,而且我认为应用程序现在“说”了 JPA。不幸的是,我现在得到一个 PersistenceException(无法配置 EntityManagerFactory),我找不到原因。也许这是一个全新的问题主题的东西。
  • 终于我成功了,感谢您的建议。在 Play 中启动并运行 hibernate-spatial 的最佳方法是从 computer-database-jpa 示例开始。我在一个新项目中分叉了它,为模型添加了几何图形,重新配置它以使用 postgresql 和 postgis 方言。现在我有了一个很好的模板,可以快速创建空间应用程序。
猜你喜欢
  • 2013-11-11
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多