为什么Oracle hibernate方言会产生无效的模式?

时间:2013-12-19 17:44:07

标签: java mysql sql oracle hibernate

在我的项目中,我需要支持来自多个供应商的多个数据库(特别是Oracle,MSSQL和MySQL)。

我有一个类,它根据我的带注释的hibernate模型类为每个数据库类型创建.sql个文件。

我有这样的课程MyEntity.java

@Entity
@Table(name = "my_table")
public class MyEntity implements java.io.Serializable {

    private Integer id;
    private Date timestamp;
    private String data;

    public MyEntity() {
    }

    @Id
    @SequenceGenerator(name = "my_table_seq", sequenceName = "my_table_seq")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "my_table_seq")
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "timestamp", nullable = false)
    public Date getTimestamp() {
        return this.timestamp;
    }

    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }

    @Column(name = "data", length = 65535)
    public String getData() {
        return this.data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

此类由hbm2java使用MySQL数据库中的逆向工程生成。 “数据”列为TEXT,“时间戳”列为TIMESTAMP

当我使用SchemaExporter类为其他数据库类型(例如oracle)生成SQL时,它会生成无效的plsql。这个类(使用Oracle10gDialect产生这样的oracle sql:

create table my_table (
    id integer not null,
    data varchar(65535),
    timestamp datetime not null
);

varchar(65535)无效,因为varchars不能那么长,datetime显然不是真正的数据类型。

使用MySQL方言时,它正确地将“数据”定义为MEDIUMTEXT类型。

为什么它会生成无效的oracle SQL?有什么方法我可以提示休眠,它应该使用文本类型?或者我是否必须扩展oracle方言以修复所有数据类型?

注意:我正在使用oracle 11.2.0.2.v7和hibernate 4.2.8.FINAL
另一个注意事项:为MSSQL生成类似的无效结果(varchar(65535)无效)。
免责声明:我是Oracle的新手

0 个答案:

没有答案