在我的项目中,我需要支持来自多个供应商的多个数据库(特别是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的新手