2016-10-05 4 views
0

Hibernate ORMを使ったSpringフレームワークの経験があります。今私はPlay Frameworkを学ぼうとしています。私はORMのためにHibernateを使用したいと思います。しかし、私はそれをどうやって行うのか分かりません。Hibernateを使ったPlayフレームワーク - SpringのようなDAO/Service/controllerの使い方

エンティティ::春の

は、私はこれらのクラスを使用

package com.example.test.entity; 

import java.io.Serializable; 
import javax.persistence.*; 

@Entity 
@Table(name="USERS") 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    @Column(name="username") 
    private String username; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getUsername() { 
     return username; 
    } 
} 

DAO:

package com.example.test.dao; 

import java.util.List; 
import com.example.test.entity.User; 

public interface UserDao { 
    public void save(User user); 
    public void delete(User user); 
    public void update(User user); 
    public List<User> findAll(); 
    public User findById(int id); 
    public User findByUserName(String username);  
} 


package com.example.test.dao; 

import java.util.List; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import com.example.test.entity.User; 

@Repository 
public class UserDaoImpl implements UserDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Override 
    public void save(User user) {this.sessionFactory.getCurrentSession().save(user);} 

    @Override 
    public void delete(User user) {this.sessionFactory.getCurrentSession().delete(user);} 

    @Override 
    public void update(User user) {this.sessionFactory.getCurrentSession().update(user);} 

    @Override 
    public List<User> findAll() { 
     return this.sessionFactory.getCurrentSession().createQuery("from User").list(); 
    } 

    @Override 
    public User findById(int id) { 
     return (User) this.sessionFactory.getCurrentSession().get(User.class, id); 
    } 

    @Override 
    public User findByUserName(String username) {  
     return (User) sessionFactory.getCurrentSession() 
       .createQuery("FROM User WHERE username = :username") 
       .setString("username", username).uniqueResult(); 
    } 
} 

サービス:

package com.example.test.service; 

import java.util.List; 
import com.example.test.entity.User; 

public interface UserManager { 
    public void save(User user); 
    public void delete(User user); 
    public void update(User user); 
    public List<User> findAll(); 
    public User findById(int id); 
    public User findByUserName(String username); 
} 


package com.example.test.service; 

import java.util.List; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 
import com.example.test.dao.UserDao; 
import com.example.test.entity.User; 

@Service 
@Transactional 
public class UserManagerImpl implements UserManager { 

    @Autowired 
    private UserDao userDao; 

    @Override 
    public void save(User user) {userDao.save(user);} 

    @Override 
    public void delete(User user) {userDao.delete(user);} 

    @Override 
    public List<User> findAll() {return userDao.findAll();} 

    @Override 
    public User findById(int id) {return userDao.findById(id);} 

    @Override 
    public void update(User user) {userDao.update(user);} 

    @Override 
    public User findByUserName(String username) { 
     return userDao.findByUserName(username); 
    }  
} 

とコントローラ:

package com.example.test.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMethod; 
import com.example.test.entity.User; 
import com.example.test.service.UserManager; 

@Controller 
public class HomeController { 
    @Autowired 
    private UserManager userManager; 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Model model) {  
     User u = userManager.findByUserName("[email protected]"); 
     model.addAttribute("user", u); 
     return "home"; 
    } 
} 

Play + Hibernateでどうすればいいですか? @Service@Repository注釈はありません。

同じエンティティ、DAO、およびサービスクラスをPlayで試してみます。 私のプレイコードがあります

package controllers; 

import com.avaje.ebean.Model; 
import models.Person; 
import play.db.jpa.Transactional; 
import play.libs.Json; 
import play.mvc.Controller; 
import play.mvc.Result; 
import service.PersonManager; 
import javax.inject.Inject; 
import java.util.List; 
import views.html.index; 

public class HomeController extends Controller { 
    @Inject 
    private PersonManager personManager; 

    public Result index() {return ok(index.render("Hello world"));} 

    @Transactional() 
    public Result getPersonByName(String name) { 
     Person p; 
     p = personManager.findByUserName("[email protected]"); 
     return ok(Json.toJson(p)); 
    } 
} 

routesファイル:

GET /   controllers.HomeController.index 

POST /person  controllers.HomeController.addPerson() 
GET /person/:id controllers.HomeController.getPersonByName(name) 

application.conf:私はbuild.sbtで休止状態を持っている

play.crypto.secret = "wtf" 
play.i18n { langs = [ "en" ] } 
play.db { 
    config = "db" 
    default = "default" 
} 
db { 
    default.driver = org.h2.Driver 
    default.url = "jdbc:h2:mem:play" 
    default.jndiName=DefaultDS 
    default.logSql=true 
} 
jpa { 
    default=defaultPersistenceUnit 
} 
ebean.default="models.*" 

libraryDependencies ++= Seq(
    javaJpa, 
    "org.hibernate" % "hibernate-entitymanager" % "5.1.0.Final" 
) 

そして休止persistence.xml:私はコマンド$ activator ~runを使用してアプリを起動した後

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
      version="2.1"> 
    <persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <non-jta-data-source>DefaultDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

、そのクラッシュ:私はチュートリアルの多くをグーグル

... 
[info] p.a.d.HikariCPConnectionPool - datasource [default] bound to JNDI as DefaultDS 
[info] p.a.d.DefaultDBApi - Database [default] connected at jdbc:h2:mem:play 
[info] application - ApplicationTimer demo: Starting application at 2016-10-05T22:06:14.913Z 
[error] application - 

! @71j15jjd7 - Internal server error, for (GET) [/] -> 

play.api.UnexpectedException: Unexpected exception[ProvisionException: Unable to provision, see the following errors: 

1) No implementation for service.PersonManager was bound. 
    while locating service.PersonManager 
    for field at controllers.HomeController.personManager(HomeController.java:24) 
    while locating controllers.HomeController 
    for parameter 1 at router.Routes.<init>(Routes.scala:44) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider 
    while locating play.api.routing.Router 
    for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200) 
    while locating play.api.http.JavaCompatibleHttpRequestHandler 
    while locating play.api.http.HttpRequestHandler 
    for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221) 
    at play.api.DefaultApplication.class(Application.scala:221) 
    while locating play.api.DefaultApplication 
    while locating play.api.Application 

。しかし、私はそれを修正できません:-(

+0

PersonManagerは表示されませんでした。それがインタフェースの場合は、インプリメンテーションの実装をバインドする必要があります。 – asch

+0

あなたはそれを説明できますか?私は "@Inject private PersonManager personManager;"を持っていますHomeControllerで。 – martin

答えて

1

PersonManagerはインタフェースなので、PersonManager PersonManagerの@Injectアノテーションは十分ではありません。このインタフェースを実装するクラスを指定する必要があります。これはSpringで@Serviceアノテーションを行っていることです。これは、プレイ中に異なっ行われ

インタフェースは単一の実装を持っている場合は、あなただけのこれを行うことができます。

@ImplementedBy(PersonManagerImpl.class) 
interface PersonManager { 
    ... 
} 

より柔軟にし、方法を推奨バインディングでモジュールを実装することですデフォルトモジュールを再生します。クラスの名前はModuleで、次のように実装する必要があります。

public class Module extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(PersonManager.class).to(PersonManagerImpl.class); 
    } 
} 

依存性注入の詳細については、Play hereで読むことができます。

関連する問題