布尔字段Oracle vs MySQL

时间:2014-11-26 07:13:52

标签: java mysql oracle entity-framework hibernate

我正在使用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;
}

知道可能出现什么问题吗?

2 个答案:

答案 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