2013-09-25 106 views
5

我正在嘗試玩框架和使用2.2.0版本和Java版本。MySQL PersistenceException,「連接已關閉」在Play! 2.2

我想使用MySQL作爲數據庫,並且我按照網站上的說明操作。我能夠運行進化腳本,但我無法將任何內容保存到數據庫。在數據庫中創建的表。當我嘗試調用Ebean.save()方法時,我得到了[PersistenceException: java.sql.SQLException: Connection is closed!],它在我的控制器中。

我所做的是:

  1. 設置build.sbt並添加插件

    libraryDependencies ++= Seq(
        javaJdbc, 
        javaEbean, 
        cache, 
        "mysql" % "mysql-connector-java" % "5.1.18" 
    ) 
    
  2. 設置的conf/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 
    
  3. Ebean服務器

    ebean.default="models.*" 
    
  4. 創建控制器類 程序包控制器;

    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()); 
        } 
    } 
    
  5. 創建的窗體

    <form action="@routes.Application.addBar()" method="post"> 
        <input name="name"/> 
        <input type="submit"/> 
    </form> 
    
  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

您必須在數據庫會話中執行與數據庫相關的操作。從您所描述的內容看,當您嘗試保存對象時,看起來沒有活動的會話(或者您沒有使用它)。在EBean API的情況下,您可能只是簡單地錯過了與底層表的連接,請看這個示例:http://www.avaje.org/ebean/getstarted_props.html – Ashalynd

+0

您是否曾經解決過這個問題?有類似的問題......奇怪地調用Ebean.update(obj)的作品(直到我做了更復雜的事情),但Ebean.save(obj)從來沒有。鬱悶了。 – chris

+1

所以我解決了這個問題。切換到JPA(看起來ebean可能會很快移動到外部包),並且不僅獲得了連接關閉錯誤,而且還因爲SQL錯誤而導致(先前)錯誤。如果我將ebean配置爲向控制檯輸出錯誤(不確定如何執行此操作),我會發現它--SQL錯誤發生器,並且連接因此被關閉。可能想要檢查這是否也是你正在發生的事情。 – chris

回答

0

你可能會嘗試的一件事是升級mysql連接器。您正在使用的一個是有點老(發佈2011年4月)

「MySQL的」%「的MySQL連接器的Java」%「5.1.26」

如果沒有幫助,那麼我會嘗試確保憑據+連接URL是否正確。

2

我有類似的問題,我找到了解決方案。

罪魁禍首是您的Bar實體的財產。您已將id定義爲字符串,並且在保存Bar時未將其設置。如果採用Long,則id值會自動生成,但對於String,您需要明確設置它。

所以,

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

應該解決這個問題。希望這可以幫助。

0

我有同樣的問題(在Mac OS X與MySQL),但我還沒有使用的字符串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

有時它可能是插入過程中跳過的'非空'列。在我的情況下,我添加了'int'類型的新列,'not null',並忘記爲它們插入值。希望它可以幫助一些人。

相關問題