我一直在使用Avaje.org ebean ORM层,但我不明白如何使用Maven 启用"Ebean v2.6.0用户指南"中描述的字节码增强功能.
我在Avaje.org主页上找到了一个配置示例,但它不起作用.GitHub上的演示Maven样板也没有.
救命!
(免责声明:这是一个非常开放的问题,我认为不仅会有一个正确的答案,反正请不要关闭它,还要考虑添加社区维基的答案)
我们正在使用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)
对于相同的操作,使用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>并添加一些信息用于普通类型参数的分页,但是...它很酷,一次性完成它:)
那些问题......
Ebean's配置优化?List …我当然正在使用single table inheritanceOOP考虑因素的概念.
例如,PostLike并TopicLike从Like类继承.
我发现这种方法存在两个问题:
我不是数据库专家,因此我想了解这个数据库设计的见解以及这两个问题是否至关重要.
我想知道的是:当我删除类别时,可以删除所有相关文章,当我删除文章时,也可以删除它的相关类别.
我设置了映射关系@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) 这与这个问题有关,但下面的例子较短,所以我认为另一个问题是有道理的.
我有两个实体,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已知/明确的限制?
我刚开始使用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注释.
我搞不清楚了.:-)
我正在尝试Play框架并使用2.2.0版本和Java版本.
我想使用MySQL作为数据库,我已经按照网站上的说明进行操作.我能够运行进化脚本,但我无法将任何内容保存到数据库中.在数据库中创建的表.我[PersistenceException: java.sql.SQLException: Connection is closed!]在尝试调用Ebean.save()方法时得到了,这是在我的控制器中.
我所做的是:
设置build.sbt并添加插件
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
"mysql" % "mysql-connector-java" % "5.1.18"
)
Run Code Online (Sandbox Code Playgroud)设置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)Ebean服务器
ebean.default="models.*"
Run Code Online (Sandbox Code Playgroud)创建控制器类包控制器;
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)创建了一个表单
<form action="@routes.Application.addBar()" method="post">
<input name="name"/> …Run Code Online (Sandbox Code Playgroud)我正在使用Ebean和Play 2 Framework,并获得了两个模型:用户模型和书籍模型.用户模型与OneToMany关系中的书籍模型相关联.因此,每个用户都可以拥有许多书籍或根本没有书籍.书籍模型本身也有属性.现在,我想在用户模型中创建一个查询,该查询仅返回具有某些属性的书籍的用户.例如:一个属性可能是条件,如new或used.现在给我所有拥有新条件书籍的用户.是否可以使用Ebean方法创建这样的查询?或者我必须使用原始SQL?
我有两个表:"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) 我正在尝试使用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运行增强器呢?
ebean ×10
java ×8
sql ×2
constraints ×1
gradle ×1
jpa ×1
jpa-2.0 ×1
left-join ×1
maven ×1
maven-3 ×1
maven-plugin ×1
mysql ×1
one-to-one ×1
scala ×1