最终编辑
我没有看到任何日志的原因是我使用的是旧版本的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,因此可以使用任何数据库。
感谢您提供任何帮助,请询问您是否需要更多信息。
马蒂亚
答案 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。不要打电话给你的模型用户。正如预防措施一样。