繁体   English   中英

将Spring应用程序从Postgres迁移到Oracle:定义表的模式

[英]Migrating Spring application from Postgres to Oracle: defining table's schema

最终编辑

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

Godd new就是从这里我可以逐个选择转换错误并修复它们,坏消息(对我而言)就是它们很多!

谢谢大家!

最终编辑结束

我有一个非常复杂的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

我做错了什么? 我是否必须以不同的方式创建架构? 或者系统用户没有权限?

应用程序由许多客户端共享,因此我的要求是尽量避免完全更改删除模式的结构。 在完美的世界中,应用程序应该是数据库indipendant,因此可以使用任何数据库。

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

马蒂亚

在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。不要​​打电话给你的模型用户。 正如预防措施一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM