2013-09-25 12 views
5

私はPlayフレームワークを試して、2.2.0バージョンとJavaバージョンを使用しています。MySQL PersistenceException、Playで "Connection is closed"が発生しました。 2.2

私はデータベースとしてMySQLを使いたいと思っています。私はサイトの指示に従っています。私は進化のスクリプトを実行することができますが、私はデータベースに何も保存することはできません。データベースに作成されたテーブル。私のコントローラーにあるEbean.save()メソッドを呼び出そうとしたときに[PersistenceException: java.sql.SQLException: Connection is closed!]を取得しました。

  1. はbuild.sbtを設定し、研究会/ application.conf

    db.default.driver=com.mysql.jdbc.Driver 
    db.default.url="jdbc:mysql://localhost:3306/TLC?characterEncoding=UTF-8" 
    db.default.user=root 
    db.default.pass=secret 
    
  2. 設定し

    libraryDependencies ++= Seq(
        javaJdbc, 
        javaEbean, 
        cache, 
        "mysql" % "mysql-connector-java" % "5.1.18" 
    ) 
    
  3. プラグインを追加しました:私はある何をやったか

    Ebeanサーバー

    ebean.default="models.*" 
    
  4. 作成コントローラクラス package controllers;フォーム

    <form action="@routes.Application.addBar()" method="post"> 
        <input name="name"/> 
        <input type="submit"/> 
    </form> 
    
  5. 作成

    import com.avaje.ebean.Ebean; 
    import play.*; 
    import play.data.Form; 
    import play.mvc.*; 
    import models.Bar; 
    import views.html.*; 
    
    public class Application extends Controller { 
    
        public static Result index() { 
         return ok(index.render("Your new application is ready.")); 
        } 
    
        public static Result addBar() { 
         Bar bar = Form.form(Bar.class).bindFromRequest().get(); 
         bar.save(); 
         return redirect(routes.Application.index()); 
        } 
    } 
    
  6. 経路

    POST /bars      controllers.Application.addBar() 
    
  7. コースのモデル自体を追加しました。 パッケージモデル。

    import play.db.ebean.Model; 
    
    import javax.persistence.Entity; 
    import javax.persistence.Id; 
    
    @Entity 
    public class Bar extends Model { 
        @Id 
        public String id; 
        public String name; 
    
    } 
    
  8. もちろん、mysqlにデータベース自体を作成します。

私は何を欠席しましたか?私は4時間のようにこの上にいたが、何が間違っているかまだ分かっていない。メモリデータベースにh2を使用した場合、うまく動作します。私を助けてください。

ありがとうございます!

+0

DBセッション内でDB関連の作業を行う必要があります。あなたが説明していることから、あなたのオブジェクトを保存しようとしている瞬間に、アクティブなセッションがない(またはそれを使用していない)ように見えます。 EBean APIの場合は、基礎となるテーブルへの接続が不足している可能性があります。この例を見てください:http://www.avaje.org/ebean/getstarted_props.html – Ashalynd

+0

これを解決しましたか?同様の問題があります...奇妙なことにEbean.update(obj)が動作しています(もっと複雑な作業を行うまで)が、Ebean.save(obj)は決して動作しません。 Maddening。 – chris

+1

私はこれを私の目的のために解決しました。 JPAに切り替わりました(すぐにebeanが外部パッケージに移動するようです)、接続エラーもなく、SQLエラーによる(以前の)エラーも発生しました。コンソールにエラーを出力するようにebeanを設定していれば(これを行う方法がわからない)、SQLエラーが発生し、結果として接続が閉じられました。それがあなたのために起こっているかどうかを確認したいかもしれません。 – chris

答えて

0

あなたが試してみることの1つは、mysqlコネクタをアップグレードすることです。あなたが使用しているものは、(2011年4月にリリースされた)少し古いです

"mysqlの" % "のmysql-コネクタ-javaの" % "5.1.26"

それが解決しない場合は、I資格情報+接続URLが正しいことを確認します。

2

私にも同様の問題があり、解決策が見つかりました。

あなたのBarエンティティの犯人はidです。 idをStringとして定義しましたが、Barを保存している間は設定していません。 Longの場合、id値は自動的に生成されますが、Stringの場合は明示的に設定する必要があります。

ので、

Bar bar = Form.form(Bar.class).bindFromRequest().get(); 
bar.id = UUID.randomUUID().toString(); 
bar.save(); 

この問題を解決する必要があります。お役に立てれば。

0

私は(MySQLでのMac OS X上で)同じ問題を抱えていたが、私は文字列のIDを使用していない

User { 
    @Id 
    public long id; 
    public String fullName;  
} 

私がしようとしたとき:

Ebean.save(user) 

を私が得た:

[PersistenceException:java.sql.SQLException:接続が閉じられています。]

自動増分戦略を使用し、mysqlコネクタを更新しても私を助けませんでした。

問題は、Unicodeなしですべてが機能したため、フィールドにUnicodeを書き込もうとしました。 MySQLデータベースはutf8_general_ciなしで作成されましたが、既存のデータベースのALTERを使用してこのプロパティを追加すると機能しないことが判明しました。

デフォルト照合で新しいデータベースを作成しますutf8_general_ci、私のために働いた。

0

挿入中にスキップされた 'not null'列の場合もあります。私の場合、 'int型'の新しい列を 'not null'で追加し、値を挿入するのを忘れてしまった。何かを助けてくれることを願っています。

関連する問題