2015-07-10 62 views
0

我有一个应用程序正在使用Play Framework 2.1.x与Ebean。我想使用SQL视图(PostgreSQL v9.3)而不是实际的表格。我试图将@Table注释中的“name”属性从实际的表名切换到查看名称。从视图中检索数据到Ebean模型很好,但是当有一个ManyToMany关联时,它会产生一个错误。问题在于Ebean为了在SQL查询中生成JOIN子句而使用的名称约定。在Play Framework 2.1.x中使用SQL视图与Ebean

例如,我有一个名为“customers”的表和一个名为“customers_view”的视图,以及ManyToMany与表“customertags”的关联。在这种情况下,Ebean使用桥表“customers_customerstags”生成JOIN子句。但是,当我将@ Table的名称属性更改为“customers_view”时,关联会混乱。 Ebean然后通过表“customers_view_customerstags”等来生成JOIN。

我知道这可以通过使用@JoinTable和@JoinColumn来解决,但首先我想问一些更有经验的程序员,如果有一些其他正确的方法如何在Play/Ebean中使用SQL视图,那么我失踪 ?

回答

0

我不认为你错过了任何东西。在没有@JoinTable等Ebean使用基于表名(现在是你的观点)的命名约定。

通过为交叉表创建视图来解决此问题的替代方法。

+0

感谢您的回答。这就是我所害怕的。另一种解决方案是将实际表格重新命名为“customers_data”,然后创建名为“customers”的视图。那么命名约定应该匹配。 – spidla

0

我也为此找到了部分解决方案。 Ebean的ServerConfig类中有一个名为setNamingConvention的函数。使用这个函数,你可以设置你自己的接口NamingConvention的实现,或者你可以覆盖来自Ebean的包含类中的函数。

我试图覆盖Ebean的名为UnderscoreNamingConvention的默认实现。通过重写getM2MJoinTableName函数,我可以修复SQL查询中创建连接表名称的错误。不幸的是,连接列还是错的。连接列由函数NamingConvention.getTableName生成。也可以重写此函数,但这种更改会破坏SQL的FROM部分的生成。

太糟糕了,无法覆盖NamingConvention接口中连接列的生成。

看来这是无可避免的。合理的解决方法是使用@JoinTable。