2012-04-12 7 views
1

を持っている場合、私は、このような単純なクラス持っ失敗:テーブル場合ormlite createTableIfNotExistsテーブルにはインデックス

TableUtils.createTableIfNotExists(MySQLConnection.getInstance() 
      .getConnection(), VlpTag.class); 

:それは存在していない場合

@DatabaseTable(tableName = "VlpTag") 
public class VlpTag implements Serializable { 

    private static final long serialVersionUID = -4912974444196844860L; 

    @DatabaseField(generatedId = true) 
    private int id; 

    @DatabaseField(foreign = true, columnName = "buid", canBeNull = false, foreignAutoCreate = true, foreignAutoRefresh = true) 
    private VlpVirtualApp vApp; 

    @DatabaseField 
    private long lastUpdated; 

    @DatabaseField(index=true) 
    private String tagValue; 

    @DatabaseField(dataType = DataType.ENUM_INTEGER) 
    private TagType tagType; 

    public static enum TagType { 
     UUID, TAG 
    }; 

    public VlpTag() { 
     // needed by ormlite 
    } 
} 

その後、私はテーブルを作成するためにTableUtilsを使用します問題は、テーブルが存在することが、ありません、存在し、ORMLiteインデックスが存在するという例外を発生しません:

java.sql.SQLException: SQL statement failed: CREATE INDEX `VlpTag_tagValue_idx` ON `VlpTag` (`tagValue`) 
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) 
    at com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:464) 
    at com.j256.ormlite.table.TableUtils.doCreateTable(TableUtils.java:440) 
    at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:220) 
    at com.j256.ormlite.table.TableUtils.createTableIfNotExists(TableUtils.java:61) 
    at com.banctecmtl.ca.vlp.controller.listvmupdater.DatabaseUpdater.<init>(DatabaseUpdater.java:47) 
    at com.banctecmtl.ca.vlp.controller.listvmupdater.ListVMUpdater.<init>(ListVMUpdater.java:42) 
    at com.banctecmtl.ca.vlp.controller.VlpController.<init>(VlpController.java:75) 
    at com.banctecmtl.ca.vlp.view.webview.server.VlpControllerServiceImpl.init(VlpControllerServiceImpl.java:32) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:212) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433) 
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:616) 
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) 
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220) 
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513) 
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:468) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.handler.RequestLogHandler.doStart(RequestLogHandler.java:115) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 
    at org.mortbay.jetty.Server.doStart(Server.java:222) 
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39) 
    at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:672) 
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:509) 
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1068) 
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811) 
    at com.google.gwt.dev.DevMode.main(DevMode.java:311) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Duplicate key name 'VlpTag_tagValue_idx' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) 
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362) 
    at com.j256.ormlite.jdbc.JdbcCompiledStatement.runExecute(JdbcCompiledStatement.java:62) 
    at com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:458) 
    ... 29 more 

このバグはすでにreported on the bug listであり、私はそれが解決されたと思っていた 私は同じ問題があります。私はMYSQLとormlite-core-4.33.jarを使用します。

ここで間違っていることがあるのですか、それとも問題がありますか?

おかげ

+0

ごめんなさい。私はしばらくの間、そのバグを見たことがあるが、それを修正することは優先事項ではない。私は少しそれをバンプします。数日後に何も聞こえない場合は、私のウェブサイトから私にpingしてください:http://256.com/gray/ – Gray

+0

さて、実際には大きな問題ではありません。彼らは何が起こっていたか知っていれば、それは彼らのために良いことができる同じ問題に実行します。 – David

+0

ええ。バグにコメントを追加します。あなたはいつでもバグにコメントすることができます。それが常に役立つことを示すユニットテストを投稿する;-)。 – Gray

答えて

1

私はこの問題の修正プログラムを追加追加済みました。 PRIMARY KEY文を追加した後

:CREATE TABLE文を

オリジナルのソリューションを構築する場合https://github.com/ethangui/ormlite-core-4.42-sources

を参照してください

CREATE TABLE IF NOT EXIST table_name ...columns... PRIMARY KEY (id)

それはconcats:

,CREATE INDEX index_name ON column name;

を10

は、基本的に2つの別個のSQLクエリを作成します。最初にテーブルを作成し、インデックスを追加します。それは、テーブルが適切なものと既に存在しない限り、テーブルを作成してインデックスを追加します。このような場合、最初のステートメントは何もしませんが、2番目のステートメントは引き続き失敗するインデックスを作成しようとします。

私の解決策: CREATE TABLEの後に別のクエリを追加するのではなく、最初のステートメントの中でADD INDEXを移動しました。表が存在する場合はそのため、

CREATE TABLE IF NOT EXIST table_name ...columns... PRIMARY KEY (id)

その後、

,KEY index_name (column_name);

したがって、文全体は、このように、何台もインデックスが作成されず、スキップされます。注意することは

THINGS:インデックスを追加するための指標=真のデータフィールドの注釈に

  1. 現在の実装のみをチェックします。

  2. インデックスなしでテーブルが事前に存在する場合、ステートメント全体はスキップされるため、インデックスは追加されません。

  3. MySQLでのみテスト済みです。