- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Java 中使用 play 2.0.4。我正在尝试从 play 提供的内存数据库中保存和检索值(Ebean 是底层 JPA 实现)。下面是一些示例代码:
@NoobDisclaimer ("I'm fairly new to Play and JPA")
@Entity
public class User extends Model {
@Id
public Long id;
public String name;
// Does not fetch eagerly.
@ManyToOne(fetch=FetchType.EAGER)
private Role role; // Role extends Model { has id and name}
public static Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class);
public static List<User> all() {
List<User> allUsers = find.all();
for (User u : allUsers) {
System.out.println("User:" + u.id + "|" + u.name); // SOP1
// System.out.println("Assoc Role:" + u.role.name); //SOP2
}
return allUsers;
}
public static void create(User user) {
user.save();
}
在 index.scala.html 中, @(users: List[User], userForm: Form[User])
<h2>@users.size() user(s) found!</h2>
<ul>
@for(usr <- users) {
<li>Name: @usr.name</li> <!-- Displayed -->
<li>Role: @usr.role.name</li> <!-- Displays blank value -->
}
</ul>
问题是,当我在 Controller 中执行 User.all() 并将其发送到 View 时,未加载 user.role,即 @usr.role.name 为空。也不异常(exception)。我已将 SQL 调试设置为打开,并且已验证 Role 表的外键已保存在 User 表中。当我在 User.all() 方法(参见 SOP2)中打印角色名称时,将触发一个查询并打印角色名称。它还显示在 View 中。
我知道,默认情况下,角色会延迟加载,模板中的 PersistenceContext 将无法用于加载与用户关联的角色。但是,急切的获取不应该让我得到一个对象的所有相关实体吗?我很陌生Play 和 JPA,当我加载某些内容时,我不知道如何在不通过每个关联实体的情况下让它工作。有什么我想念的吗?
相关说明,如果我必须使用延迟获取,我如何确保在获取用户时 user.role 可用于 View ?
最佳答案
Ebean is the underlying JPA implementation
Ebean 不是 JPA 实现。 Ebean 与 JPA 标准有一些共同之处。它看起来有点相似,因为它的注释看起来与 JPA 的相似。
问题的原因:Ebean 不支持 @ManyToMany 注释上的 fetch=... 属性。
2个解决方案:
从注解中删除 fetch=... 并在 play.db.ebean.Model.Finder<I,T>
上使用 fetch() 方法对象(实现 com.avaje.ebean.Query<T>
)或 com.avaje.ebean.Ebean 对象。
问题是这里有两个独立的持久库(play.db.ebean 和 com.avaje.ebean),它们之间的集成是一个挑战和问题。
例如。 play.db.ebean.Model.Finder.fetch() 方法返回 com.avaje.ebean.Query<T>
而不是 play.db.ebean.Model.Finder - 我发现它没有帮助,因为它会让你远离 play API 模型助手。在调用 fetch() 之后,您显然不能再使用 Model.Finder 方法 - 那时还没有多少“帮助”类。
老实说,我不认为获取功能是 Play API 中的一流功能 - 最好遵从 Avaje API。
在 Avaje API 中使用 fetch() 的两个示例:
// single SQL query with a fetch join
List<Order> l0 = Ebean.find(Order.class)
.fetch("customer")
.findList();
和
// two separate SQL queries
List<Order> l0 = Ebean.find(Order.class)
.fetch("customer", new FetchConfig().query())
.findList();
注意:Ebean 的最后一次发布/更新(其他错误修复)是 2010 年 11 月 6 日 - 整整 2 年前。 Ebean的吸收率很低。
切换到在 Play 中使用 JPA 2.0 实现。 JPA 的 2.0 版本确实非常强大,易于使用,并且得到了非常广泛的支持。这可能意味着 Ebean 的死亡。请注意,Play 已将以下配置功能添加到 2.0 中(在 1.1 中不存在)——这表明 Play 正在朝着来自任何提供商的 JPA 提供更全面的支持。 http://www.playframework.org/documentation/2.0/JavaJPA
执行此操作后,停止使用 play.db 类和 com.avaje 类 - 我建议您使用 100% javax.persistence 类。
关于playframework - Eager fetch 好像没有加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13171476/
显然,可以实现 Haskell,使其在不改变语言语义的情况下急切地求值。如果这是真的,如何处理无限数据结构? http://csg.csail.mit.edu/pubs/haskell.html Th
有没有什么方法可以像@ManagedBean(eager=true ) 来自 javax.faces 包? @Named @ApplicationScoped public Mail() { ...
使用@ApplicationScoped @Named @Eager,我的@EJB注入(inject)的@Stateless bean未正确实例化并评估为空。 我有一个@ApplicationScop
我必须删除两个分隔符之间的字符串,即 从“123XabcX321”我想要“123321”。 对于一个简单的案例,我很好: $_=<>; s/X(.*)X//; print; 但是,如果像“123Xab
我有一个对象层次结构,订单,联系人,地址: public class Order { public virtual Contact BillingContact { get; set; }
Eager 模式仅支持 TF native 优化器我在以下尝试过的每个优化器中都会遇到此错误: def create_model(): model = tf.keras.models.Sequ
我有这样的数据设计:交易属于授权,而授权又属于客户。或者用结构体表示: type Transaction struct { shared.Transaction // transaction
我想在 Scheme 中做一个懒惰的列表。这是我到目前为止。 ;; Constructor for Pairs (define (cons-stream a b) (cons a (λ() b))
今天是个好日子 我是 Laravel 的新手,目前正在用它构建我的第一个简单的新闻应用程序 我有一个简单的查询,使用 laravel 的预先加载功能 但是在这个急切的加载功能中,我想根据某些条件获取某
我正在制作一个动态表单,让用户使用 vue.js 自动生成带有游戏统计信息的图像,并使用 Keen-ui。我是 vue.js 的新手,过去两周开始学习它。 现在,我在使用 eager-ui 进行选择下
我 fork 了 eager/dashboards github 存储库,并尝试创建一个 Dockerfile 以在 Docker 容器中运行仪表板。 我的 fork :https://github.
我的实体: @Entity @NoArgsConstructor public class Company { @Id @Getter @GeneratedValue(strategy =
在我的实体中,我必须使用 fetch = FetchType.EAGER 因为我有一个错误: nested exception is org.hibernate.LazyInitializationE
我在 Java 中使用 play 2.0.4。我正在尝试从 play 提供的内存数据库中保存和检索值(Ebean 是底层 JPA 实现)。下面是一些示例代码: @NoobDisclaimer ("I'
在 Pro .NET Performance - Optimize Your C# Applications 的第 96 页上,它谈到了 GC 急切根收集: For each local variab
我无法从数据库加载对象及其相对映射对象。可能我的“ map 系统”是错误的。 在数据库中保存对象(及其相对映射对象)时,一切正常,因此对象似乎已正确映射。 Utente是我的“主”对象 publ
我需要使用急切查询在 Laravel 中执行子查询,但结果始终为空。 查询: $project = Log::where('project_id', $id)->with(['log_occurenc
我有这个程序: var planetStream = require('../../'); var app = require('http').createServer(handler); var i
我需要与FetchType.EAGER(下面的示例)建立关系,但我有异常(exception)。如果我将 FetchType.EAGER 更改为 FetchType.LAZY 一切正常,但我确实需要
我正在使用 EF6 并尝试急切获取对象的整个结构。问题是我正在使用继承。 假设我有这个类(class)。 数据库上下文 DbSet A { get; set; } 示例类 public class A
我是一名优秀的程序员,十分优秀!