2011-07-21 53 views
2

我对数据库编程颇为陌生,正试图创建一个Java程序来访问使用hibernate的hsqldb(version2.2.5)。我的程序中有3个类,我映射到3个表如下所示。帮助为hsqldb创建模式sql

我想在SaleOrder和Bill之间创建一对一映射。 另外,为了创建数据库的模式,我尝试了sql创建语句。 这两个表SALEORDER和比尔有作为FK.To避免表之间的相关性错误过程中创建对方的ID,我用ALTER TABLE添加约束声明

现在,我想在开始时使用DROP TABLE语句script.I使用以下

ALTER TABLE SALEORDER DROP CONSTRAINT FK_SO_BILL; 
ALTER TABLE SALEORDER DROP CONSTRAINT FK_SO_BUYER; 
ALTER TABLE BILL DROP CONSTRAINT FK_BILL_SO; 
ALTER TABLE BILL DROP CONSTRAINT FK_BILL_BUYER; 

DROP TABLE BUYER IF EXISTS; 
DROP TABLE SALEORDER IF EXISTS; 
DROP TABLE BILL IF EXISTS; 

然而,这时候第一次(因为要改变的表不存在)。我找不到“IF存在”为条款运行导致问题ALTER TABLE in hsqldb ..那么解决方案是什么?我应该首先单独创建表脚本,然后添加alter table,之后显示的drop table语句?这听起来并不干净。

将是您的建议表示感谢,

真诚,

吉姆

主要架构脚本是

CREATE TABLE BUYER(
    BUYER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    NAME VARCHAR(100) 
); 

CREATE TABLE SALEORDER(
    SALEORDER_ID BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    BUYER_ID BIGINT NOT NULL, 
    BILL_ID BIGINT, 

); 

CREATE TABLE BILL(
    BILL_ID BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    BUYER_ID BIGINT NOT NULL, 
    SALEORDER_ID BIGINT NOT NULL, 

    ); 
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BILL FOREIGN KEY(BILL_ID) REFERENCES BILL(BILL_ID); 
ALTER TABLE SALEORDER ADD CONSTRAINT FK_SO_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID); 
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_BUYER FOREIGN KEY(BUYER_ID) REFERENCES BUYER(BUYER_ID); 
ALTER TABLE BILL ADD CONSTRAINT FK_BILL_SO FOREIGN KEY(SALEORDER_ID) REFERENCES SALEORDER(SALEORDER_ID); 

而且,我使用Ant目标创建模式

<target name="createschema" description="execute schema"> 
      <sql 
        driver="${db.driver}" 
        url="${db.url}" 
        userid="${db.username}" 
        password="${db.password}" 
        print="yes" 
        src="${dir.schema}/${file.schema}" 
        caching="false" 
        showheaders="true" 
        > 
       <classpath> 
        <path location="${dir.lib}/hsqldb.jar"/> 
       </classpath> 
      </sql> 
     </target> 

回答

1

在删除表之前,您不需要ALTER TABLE语句。

使用CASCADE关键字强制删除外键约束。

DROP TABLE BUYER IF EXISTS CASCADE 
DROP TABLE SALEORDER IF EXISTS CASCADE 
DROP TABLE BILL IF EXISTS CASCADE 

也可以用

DROP SCHEMA PUBLIC CASCADE 

而下降模式中的所有现有对象。

+0

第一次没有表时,它工作。但是当我第二次尝试时,我得到了DROP TABLE SALEORDER IFOCUSTS CASCADE上的空指针异常。 – jimgardener

+0

我首先使用drop schema并运行sql。它工作正常。当我再次运行它时,它会抛出nullpointer异常。这里是sql脚本连续运行的输出http://pastebin.com/RgWUp0CY – jimgardener

+0

我正在创建通过使用蚂蚁目标的模式。我已经将它添加到 – jimgardener