2013-09-25 15 views
5

Próbuję grać w Play i używać wersji 2.2.0 i Java.MySQL PersistenceException, "Połączenie zostało zamknięte" w Play! 2.2

Chcę używać MySQL jako bazy danych i postępuję zgodnie z instrukcją na stronie. Mogę uruchomić skrypt ewolucyjny, ale nie mogę zapisać niczego w bazie danych. Tabela utworzona w bazie danych. Mam [PersistenceException: java.sql.SQLException: Connection is closed!] podczas próby wywołania metody Ebean.save(), która jest w moim kontrolerze.

Co robiłem jest:

  1. Konfigurowanie build.sbt i dodał wtyczki

    libraryDependencies ++= Seq(
        javaJdbc, 
        javaEbean, 
        cache, 
        "mysql" % "mysql-connector-java" % "5.1.18" 
    ) 
    
  2. Skonfiguruj 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. Serwer eBean

    ebean.default="models.*" 
    
  4. Utworzono kontroler pakietów klasy ;

    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. Utworzono formą

    <form action="@routes.Application.addBar()" method="post"> 
        <input name="name"/> 
        <input type="submit"/> 
    </form> 
    
  6. Dodane trasie

    POST /bars      controllers.Application.addBar() 
    
  7. Model sama oczywiście. modele pakietów;

    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. I oczywiście tworzenie samej bazy danych w mysql.

Czego mi brakowało? Byłem w tym przez 4 godziny i wciąż nie mam pojęcia, co jest nie tak. Jeśli użyłem h2 w bazie danych pamięci, to działa dobrze. Proszę pomóż mi.

Dzięki!

+0

Musisz robić rzeczy związane z DB w sesji DB. Z tego, co opisujesz, wynika, że ​​nie ma aktywnej sesji (lub jej nie używasz) w momencie, gdy próbujesz zapisać swój obiekt. W przypadku EBean API może być po prostu brak połączenia z podstawową tabelą, spójrz na ten przykład: http://www.avaje.org/ebean/getstarted_props.html – Ashalynd

+0

Czy kiedykolwiek rozwiązałeś to? Mając podobne problemy ... dziwnie nazywając Ebean.update (obj) działa (dopóki nie zrobię czegoś bardziej skomplikowanego), ale Ebean.save (obj) nigdy nie robi. Szalony. – chris

+1

Rozwiązałem to z mojego powodu. Przełączono na JPA (wydaje się, że eBean może wkrótce zostać przeniesiony do zewnętrznego pakietu) i otrzymaliśmy nie tylko błąd zamknięcia połączenia, ale także (wcześniejszy) błąd z powodu błędu SQL. Gdybym skonfigurował ebean do wysyłania błędów do konsoli (nie wiem, jak to zrobić w tej chwili), przyłapałbym go - wystąpił błąd SQL, a połączenie zostało w rezultacie zamknięte. Może chcieć sprawdzić, czy to też się dzieje. – chris

Odpowiedz

0

Jedna rzecz, którą możesz spróbować, to uaktualnienie złącza mysql. Jedna używasz jest nieco stary (ukazał kwiecień 2011)

"mysql" % "mysql-connector-java" % "5.1.26"

Jeśli to nie pomoże, to ja spróbuję się upewnić, że adres URL + poświadczenia połączenia jest poprawny.

2

Miałem podobny problem i znalazłem rozwiązanie.

Sprawcą jest id własność jednostki Bar. Zdefiniowałeś id jako String i nie ustawiasz go podczas zapisywania Bar. Incase of Long, wartość id jest generowana automatycznie, ale dla String należy ustawić ją jawnie.

tak,

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

powinno rozwiązać ten problem. Mam nadzieję że to pomoże.

0

miałem ten sam problem (w systemie Mac OS X z MySQL), ale nie zostały wykorzystane string id

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

gdy próbowałem:

Ebean.save(user) 

mam:

[PersistenceException: java.sql.SQLException: połączenie jest zamknięte!]

Skorzystaj ze strategii automatycznej inkrementacji i zaktualizuj złącze mysql, które mi nie pomogło.

Problem polegał na próbie napisania unicode w polu, ponieważ bez Unicode wszystko działało. Po bliższej inspekcji okazało się, że baza danych MySQL została utworzona bez utf8_general_ci, ale dodanie tej właściwości przy użyciu ALTER na istniejącej bazie danych nie działa.

Utwórz nową bazę danych z domyślnym sortowaniem utf8_general_ci, dla mnie.

0

Czasami może to być kolumna "nie pusta" pomijana podczas wstawiania. W moim przypadku dodałem nową kolumnę typu "int" z "not null" i zapomniałem wstawić dla nich wartości. Mam nadzieję, że może pomóc nikomu.

Powiązane problemy