标签: ebean

如何在Maven中启用Ebean Enhancement?

我一直在使用Avaje.org ebean ORM层,但我不明白如何使用Maven 启用"Ebean v2.6.0用户指南"中描述的字节码增强功能.

我在Avaje.org主页上找到了一个配置示例,但它不起作用.GitHub上的演示Maven样板也没有.

救命!

java maven-plugin maven-3 maven ebean

5
推荐指数
1
解决办法
3581
查看次数

我们如何改善Ebean的远程性能?

(免责声明:这是一个非常开放的问题,我认为不仅会有一个正确的答案,反正请不要关闭它,还要考虑添加社区维基的答案)

我们正在使用Ebean作为主要ORM的Play应用程序,而我们在本地服务器上处于开发模式,一切都很好.但是应用程序的目标环境是云+远程SQL服务器.在连接到目标数据库之后,我们发现在本地环境中只有一件事是不可见的:Ebean执行单独查询的次数比手动编写的语句长很多倍.举个例子:

声明

此查询resultSet~1200ms内执行子查询系列:

while (resultSet.next()) {
    Statement innerStatement = connection.createStatement();
    ResultSet innerSet
            = innerStatement.executeQuery("SELECT title FROM media WHERE id='" + resultSet.getInt("id") + "'");
    while (innerSet.next()) {
        Logger.info("Statement: " + innerSet.getString("title"));
    }
}
Run Code Online (Sandbox Code Playgroud)

Ebean

对于相同的操作,使用resultSet Ebean大约~6500ms的相同需求.(Media模型没有任何关系,所以没有任何连接):

while (resultSet.next()) {
    Media media = Media.find.select("title").where().eq("id", resultSet.getInt("id")).findUnique();
    Logger.info("Ebean: " + media.title);
}
Run Code Online (Sandbox Code Playgroud)

编辑: 在本地环境差异并不是那么好,一般所有查询都快得多.

当然,很多地方的查询系列可以用单个替换,但并不总是可行的.有时我们需要在一个请求中查询几个不同的表.在其他情况下,我们需要逐个匹配不同数据库之间的数千条记录,等等.

我们还发现,例如,Page<Media>传递给Play视图时,类会对其列表中的每个项执行单独的选择.在这种情况下,它很容易getList()在控制器中传递List<Media>并添加一些信息用于普通类型参数的分页,但是...它很酷,一次性完成它:)

那些问题......

  1. 如何进行Ebean's配置优化?
  2. 如何进行查询优化(即提及List …

java ebean playframework-2.0 azure-sql-database

5
推荐指数
1
解决办法
524
查看次数

单表继承(使用Ebean + Play!框架)

我当然正在使用single table inheritanceOOP考虑因素的概念.
例如,PostLikeTopicLikeLike类继承.
我发现这种方法存在两个问题:

  1. 而不是两个表(PostLike和TopicLike),我得到了喜欢的"一大桌子".
  2. 这个表有一个名为dtype的额外列,它可以识别记录(即类似的类型).从长远来看,它可能是磁盘空间的巨大浪费.不是吗?

我不是数据库专家,因此我想了解这个数据库设计的见解以及这两个问题是否至关重要.

java database-design jpa ebean playframework-2.0

5
推荐指数
1
解决办法
1344
查看次数

播放框架2.1和Ebean:@ManyToOne和@OneToMany,CRUD和级联问题

我想知道的是:当我删除类别时,可以删除所有相关文章,当我删除文章时,也可以删除它的相关类别.

我设置了映射关系@ManyToOne,@OneToMany(cascade = CascadeType.ALL, mappedBy = " category")就像下面的代码一样,但是当我进行单元测试时,出现了几个问题,它不起作用.这是我的代码:

@Entity
public class Article extends Model {
    @Id
    public Long id;     

    @Constraints.Required       
    public String title;

    @Constraints.Required
    @Lob
    @Basic(fetch = FetchType.LAZY)
    public String content;

    public boolean published = false;

    @Formats.DateTime(pattern="yyyy-MM-dd")
    public Date publishDate;

    @ManyToMany(cascade = CascadeType.REMOVE)
    @Column(nullable = true)
    public List<Tag> tags = new ArrayList<Tag>();

    @ManyToOne
    @Column(nullable = true)
    public Category category;

    public static Finder<Long, Article> finder = new Finder<Long, Article>(Long.class, Article.class);

    public Article(String title, String content, Tag[] tags) …
Run Code Online (Sandbox Code Playgroud)

ebean playframework-2.1

5
推荐指数
1
解决办法
2288
查看次数

Play + Ebean + JPA:在OneToOne映射上级联删除

这与这个问题有关,但下面的例子较短,所以我认为另一个问题是有道理的.

我有两个实体,A和B,一对一的关系.对于A,B是可选的,并且每个B必须具有A.我想级联从A到B的删除.这是我的第一次尝试:

@Entity
public class A extends Model {

    @Id
    private Long id;

    @OneToOne(optional = true, mappedBy = "a", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private B b;

}

@Entity
public class B extends Model {

    @Id
    private Long id;

    @OneToOne(optional = false)
    private A a;

}
Run Code Online (Sandbox Code Playgroud)

但是,似乎Ebean忽略了"可选"注释,因为当我为ID为1的已保存A执行查找时,将执行以下SQL:

select t0.id c0, t1.id c1 
from a t0
join b t1 on t1.a_id = t0.id 
where t0.id = 1  
Run Code Online (Sandbox Code Playgroud)

换句话说,它执行内部而不是左连接,这导致查找失败,当没有关联B.我尝试了各种组合@JoinColumn,等等无济于事.我发现的唯一令人满意的解决方法是将A-to-B模型化为"假的"一对多关系.有更好的解决方案吗?这是一个错误还是Ebean已知/明确的限制?

java one-to-one jpa-2.0 ebean playframework-2.1

5
推荐指数
1
解决办法
1601
查看次数

播放:自定义Ebean约束

我刚开始使用Play,并试图在我的模型上获得一些自定义约束.

我发现这有效

@Constraints.Required
@Constraints.MaxLength(15)
@Constraints.MinLength(4)
@Constraints.Pattern(value = "^\\w\\s$")
public String username;
Run Code Online (Sandbox Code Playgroud)

但是现在我想用自己的实现添加一个自定义约束(用于检查唯一性)所以我尝试了这个(它由我的IDE自动完成,所以它确实存在)

@Constraints.ValidateWith(Account.UniqueValidator.class)
public String username;
Run Code Online (Sandbox Code Playgroud)

我找到了某个地方(已经经历了很多链接所以找不到它,该类应该扩展Constraints.Validator

这就是我所做的.

 private class UniqueValidator extends Constraints.Validator<String>
{

    @Override
    public boolean isValid(String s) {
        return Account.find.where().eq("username", s).findRowCount() == 0;
    }

    @Override
    public F.Tuple<String, Object[]> getErrorMessageKey() {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道在getErrorMessageKey值中返回什么,它是一个必需的实现方法.我查看了游戏来源,发现了"东西"看起来像这样.即NotEmpty验证器.

然而,当你看到它时,你会看到它返回一个元组,而不是F.Tuple.当我在我的代码中更改它时,它抱怨它不是F.Tuple.

试图回来

return Tuple("error.invalid", new Object[] {});
Run Code Online (Sandbox Code Playgroud)

正如上面的NotEmpty验证器链接所做的那样.但是它表示在Tuple之前它需要"new",但这给了我一个包含一堆必要方法来实现的类.所以我想这不是真正的方法.


当我在这里查看play的文档时,我需要使用@CheckWith注释,但是当我选择它时,它说它找不到@CheckWith注释.

我搞不清楚了.:-)

java scala constraints ebean playframework-2.0

5
推荐指数
1
解决办法
1953
查看次数

MySQL PersistenceException,Play中的"Connection is closed"!2.2

我正在尝试Play框架并使用2.2.0版本和Java版本.

我想使用MySQL作为数据库,我已经按照网站上的说明进行操作.我能够运行进化脚本,但我无法将任何内容保存到数据库中.在数据库中创建的表.我[PersistenceException: java.sql.SQLException: Connection is closed!]在尝试调用Ebean.save()方法时得到了,这是在我的控制器中.

我所做的是:

  1. 设置build.sbt并添加插件

    libraryDependencies ++= Seq(
        javaJdbc,
        javaEbean,
        cache,
        "mysql" % "mysql-connector-java" % "5.1.18"
    )
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. Ebean服务器

    ebean.default="models.*"
    
    Run Code Online (Sandbox Code Playgroud)
  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());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 创建了一个表单

    <form action="@routes.Application.addBar()" method="post">
        <input name="name"/> …
    Run Code Online (Sandbox Code Playgroud)

java mysql sql playframework ebean

5
推荐指数
1
解决办法
3492
查看次数

OneToMany关系的Ebean查询

我正在使用Ebean和Play 2 Framework,并获得了两个模型:用户模型和书籍模型.用户模型与OneToMany关系中的书籍模型相关联.因此,每个用户都可以拥有许多书籍或根本没有书籍.书籍模型本身也有属性.现在,我想在用户模型中创建一个查询,该查询仅返回具有某些属性的书籍的用户.例如:一个属性可能是条件,如new或used.现在给我所有拥有新条件书籍的用户.是否可以使用Ebean方法创建这样的查询?或者我必须使用原始SQL?

java playframework ebean playframework-2.0

5
推荐指数
1
解决办法
8019
查看次数

如何在Ebean中的两个参数上进行左连接?

我有两个表:"users"和"mail_list"以及相应的类.
这些表通过user_id引用id(在users表中)的外键(在mail_list表中)的帮助连接.用户可以kinds在mail_list表中记录两个- "general"或/和"admin".如果用户在mail_list表中有记录,这意味着他不想收到相应类型的邮件.
我想找到所有想收到一般邮件的用户.我确信正确的SQL查询看起来像这样:

SELECT U.id, U.email, M.user_id, M.kind
FROM users U
LEFT JOIN mail_list M
ON (U.id = M.user_id AND M.kind = 'general')
WHERE M.user_id IS NULL
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我对Ebean不太好.请问,如果有可能,请帮我写一个这样的Ebean查询?我想避免使用Raw SQL.

在这里,我的课程的一些代码是:

@Entity
@Table(name = "users")
public class User {
    @Id
    public Long id;

    public String email;

    @OneToMany(mappedBy = "user")
        public List<MailList> mailLists;
    }

    @Entity
    @Table(name = "mail_list")
    public class MailList {
        @Id
        public Long id;

    /**
     * Kind of mail list
     */
    public String …
Run Code Online (Sandbox Code Playgroud)

java sql left-join ebean playframework-2.3

5
推荐指数
1
解决办法
1664
查看次数

使用PlayFramework + Ebean和Gradle

我正在尝试使用Play Gradle插件来编译/打包使用Ebean的Play 2.3.x应用程序.

在编译和打包过程中一切正常,但是当我运行应用程序时,我得到了众所周知的错误

Entity type class SomeEntity is not an enhanced entity bean. 
Subclassing is not longer supported in Ebean
Run Code Online (Sandbox Code Playgroud)

那么如何在编译期间让Gradle运行增强器呢?

gradle playframework ebean

5
推荐指数
1
解决办法
767
查看次数