我正在使用hibernate来创建表。在我的实体中,我有以下字段。使用MySQL数据库时成功创建了该实体。但是在oracle 10g上它会抛出错误
create table MetaData (ID bigint not null auto_increment, metaDataId varchar(255) not null, parentId bigint not null, locked bit, userId bigint not null, primary key (ID), unique (metaDataId))
java.sql.SQLSyntaxErrorException: ORA-00907: missing right parenthesis
实体:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorOptions(force = true)
@Table(name = "MetaData", uniqueConstraints = @UniqueConstraint(columnNames = "metaDataId"))
public class MetaData extends SavableEntity {
@Column(nullable = false)
private String metaDataId;
@Column(nullable = false)
private Long parentId;
@Column(nullable = false)
private Long userId;
@Column
@Type(type = "boolean")
private boolean locked;
}
知道可能出现什么问题吗?
答案 0 :(得分:0)
如果仔细查看生成的SQL语法,您将会发现锁定字段的数据类型及其名称"已锁定"
create table MetaData (..., **locked bit**, ...)
与...进行比较字段userId,数据类型为bigint
create table MetaData (..., **userId bigint not null**, ...)
由于某些数据库没有实现布尔字段,您需要编写一些注释来帮助休眠执行转换。
如果要将布尔值存储为T或F,请使用:
@Type(type="true_false")
private Boolean active;
将它们存储为1或0时使用:
@Type(type="boolean")
private Boolean active;
先生。 Jake Trent提供了一篇关于如何执行hibernate布尔转换的精彩帖子:http://jaketrent.com/post/hibernate-boolean-conversion/
答案 1 :(得分:0)
DATATYPE
中的Oracle
不同。
此外,auto_increment
不在Oracle
中。在11g
及之前,创建SEQUENCE
以填充ID列,在12c
中,使用IDENTITY COLUMNS
。
SQL> DROP TABLE metadata PURGE;
Table dropped.
SQL>
SQL> CREATE TABLE MetaData
2 (
3 ID NUMBER NOT NULL,
4 metaDataId VARCHAR2(255) NOT NULL,
5 parentId number NOT NULL,
6 locked number,
7 userId number NOT NULL,
8 CONSTRAINT p_id PRIMARY KEY (id),
9 CONSTRAINT u_metadataid UNIQUE (metaDataId)
10 );
Table created.
SQL>
对于auto_increment
的ID,Oracle 10g
,您需要创建sequence
。
在12c
中,您可以拥有IDENTITY COLUMN
。