因此,最近开始使用将使用Play 2.4的新Web应用程序。我已经在许多项目中使用了JPA,但是这次我决定试一试Ebean。

但是我想知道关注点分离。使用JPA,我通常会创建用于持久性的模型,服务和DAO。通过Ebean,我了解到模型上支持静态方法(请参见http://ebean-orm.github.io/quickstart“创建模型”)。

我已经看到了很多示例,其中所有似乎都包含在模型中的这些静态方法中。业务逻辑,持久性逻辑及其他。我应该接受使用Ebean时的最佳实践吗?还是使用服务和DAO分离逻辑仍然有意义,我将以最好的方式去做那件事?

最佳答案

您可以完全像使用JPA一样做事,并创建DAO等。

如果检查Ebean示例中的静态方法,您会发现它们通常使用Finder。对于主键为Country String的表iso2,您将具有以下模型类:

@Entity
public class Country extends Model {
    @Id
    public String iso2;

    // other stuff
}


在Ebean示例的ActiveRecord样式的代码中,将包含一些其他内容。

@Entity
public class Country extends Model {

    private static final Finder<String, Country> FIND = new Finder<>(String.class, Country.class);

    @Id
    public String iso2;

    public static List<Country> findAll() {
        return FIND.all();
    }

    // other stuff
}


如果要将其更改为DAO样式的方法,只需将与Finder相关的代码移出Country

public class CountryDao {
    private static final Model.Finder<String, Country> FIND = new Model.Finder<>(String.class, Country.class);

    // not static if you don't want it to be
    public List<Country> findAll() {
        return FIND.all();
    }
}


您使用哪种方法进入了意见领域,但DAO方法有很多建议,尤其是现在Play支持开箱即用的DI。不用让控制器对模型类进行硬编码引用,您只需注入DAO即可。

// direct reference to the Country class
public class ControllerWithActiveRecord extends Controller {
    public F.Promise<Result> getAllCountries() {
        return F.Promise.promise(() -> Country.findAll())
                        .map(Json::toJson)
                        .map(Results::ok);
    }
}


交替使用DI。

public class ControllerWithInjectedDAO extends Controller {

    private final CountryDAO countryDAO;

    @Inject
    public ControllerWithInjectedDAO(final CountryDAO countryDAO) {
        this.countryDAO = countryDAO;
    }

    public F.Promise<Result> getAllCountries() {
        return F.Promise.promise(() -> countryDAO.findAll())
                        .map(Json::toJson)
                        .map(Results::ok);
    }
}

关于java - Play 2.4:如何用Ebean分离问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31160360/

10-10 19:38