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

时间:2013-12-06 15:50:51

标签: java spring oracle hibernate postgresql

最终编辑

我没有看到任何日志的原因是我使用的是旧版本的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,因此可以使用任何数据库。

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

马蒂亚

1 个答案:

答案 0 :(得分:3)

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