【问题标题】:Migrating Spring application from Postgres to Oracle: defining table's schema将 Spring 应用程序从 Postgres 迁移到 Oracle:定义表的模式
【发布时间】:2013-12-24 01:15:18
【问题描述】:

最终编辑

我没有看到任何日志的原因是我使用的是旧版本的 log4j。 Hibernate hbm2ddl 使用 slf4j 进行日志记录,因此 log4j 1 忽略了所有日志。现在我升级到具有 slf4j 网桥的 log4j2,我在日志中看到了所有错误。

天哪,我可以从这里一一挑选转换错误并修复它们,坏消息(对我来说)是它们很多!

谢谢大家!

最终编辑结束

我有一个非常复杂的 java7+Spring3.2.0+hibernate3 Web 应用程序,它与 Postgresql 数据库一起工作。客户现在要求使用 Oracle 作为项目的数据库。我无法弄清楚 Oracle 中的 Schema 使用情况。

Postgresql 数据库分为大约 10 个不同的模式,以及用于审计记录的独立模式。我在注释中定义表和模式。即:

@Entity
@Table(name = "language", schema = "live")
@Audited
@AuditTable(value="language_aud", schema="live_aud")
public class Language implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;
etc...

这在 Postgres 中运行良好。要创建数据库,我首先手动创建模式:

CREATE SCHEMA live;

然后使用 hibernate.hbm2ddl.auto=create 启动应用程序。这就像一个魅力,并且数据库已正确构建。

现在转移到 Oracle 我在架构定义方面遇到了问题。我尝试了 CREATE SCHEMA 语句,但没有成功,但后来发现在 Oracle schema=user 中(对我来说很奇怪,但一定有原因)。所以我创建了所有用户来匹配 Schema 结构。即:

CREATE USER live IDENTIFIED BY 'password';

** 编辑 **

但这仍然不起作用,当我运行应用程序时,表不是由 hibernate 创建的(我修复了之前的异常,将 try/catch 添加到 postProcess 方法,由于未创建数据库,它们失败了)

我可以与Oracle正确连接,我使用参数:

jdbc.driver=oracle.jdbc.driver
jdbc.url=jdbc:oracle:thin:@//localhost:1521/XE
jdbc.username=system
jdbc.password='password'
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

我做错了什么?我必须以不同的方式创建模式吗?还是系统用户没有权限?

该应用程序由许多客户共享,因此我的要求是尽量避免完全改变结构以移除架构。在完美的世界中,应用程序应该是独立于数据库的,因此可以与任何数据库一起使用。

感谢您提供的任何帮助,如果您需要更多信息,请询问。

马蒂亚

【问题讨论】:

  • 能不能开启休眠日志,看看生成了什么sql查询。您还更新了休眠配置中的方言吗?
  • 感谢提示,方言确实是错误的,但我仍然得到错误。当错误出现时,我将使用完整的日志进行编辑。我有怎么 sql = true
  • 因为我使用的是旧版本的 log4j,所以没有记录任何内容...

标签: java spring oracle hibernate postgresql


【解决方案1】:

在 oracle 中,id 不是自动生成的。您必须手动管理它或使用序列。

不要使用

@GeneratedValue(strategy = GenerationType.AUTO)

试试这个

@Id 
@SequenceGenerator(name="language_generator", sequenceName="language_sequence")
@GeneratedValue(generator="language_generator")
@Column(name = "id")
private Integer id;

确保对所有模型都这样做

** 编辑 ** 在创建 Oracle 用户时试试这个:

SQL> CREATE USER live IDENTIFIED BY 'password'
2  QUOTA UNLIMITED ON SYSTEM
3  QUOTA UNLIMITED ON SYSAUX;

SQL> GRANT CREATE SESSION TO live;

SQL> GRANT CREATE TABLE TO live;

SQL> GRANT SELECT_CATALOG_ROLE TO live; 

SQL> GRANT EXECUTE_CATALOG_ROLE TO live;

SQL> EXECUTE DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(grantee => 'live');


SQL> GRANT UNLIMITED TABLESPACE TO live;

SQL> GRANT RESOURCE TO live;

在您投入生产时将其锁定。就像拿走一些特权,比如删除表的能力等。PS 不要打电话给你的模型用户。只是作为预防措施。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多