Playframework 急切的获取似乎没有加入
我在Java中使用Play2.0.4。我试图从play提供的内存db中保存和检索一个值(Ebean是底层JPA实现)。 下面是一些示例代码:Playframework 急切的获取似乎没有加入,playframework,jpa-2.0,Playframework,Jpa 2.0,我在Java中使用Play2.0.4。我试图从play提供的内存db中保存和检索一个值(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
@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();
}
@NoobDisclaimer(“我对游戏和JPA都是新手”)
@实体
公共类用户扩展模型{
@身份证
公共长id;
公共字符串名称;
//不急于取回。
@manytone(fetch=FetchType.EAGER)
私有角色角色;//角色扩展模型{has id and name}
publicstaticfinder=newfinder(Long.class,User.class);
公共静态列表所有(){
List alluser=find.all();
用于(用户u:allUsers){
System.out.println(“用户:+u.id+“|”+u.name);//SOP1
//System.out.println(“Assoc Role:+u.Role.name);//SOP2
}
回归诱惑;
}
公共静态无效创建(用户){
user.save();
}
}
在index.scala.html中,
@(用户:列表[用户],用户表单:表单[用户])
找到@users.size()个用户!
@用于(usr)
}
Ebean是底层JPA实现
Ebean不是JPA实现。Ebean与JPA标准有一点共同点。它看起来有点类似,因为它的注释看起来类似于JPA
问题原因:Ebean不支持@ManyToMany注释上的fetch=…属性。
2种解决方案:
- 从注释中删除fetch=…并对
play.db.ebean.Model.Finder
对象(实现com.avaje.ebean.Query
)或com.avaje.ebean.ebean对象使用fetch()方法
问题是这里有两个独立的持久库(play.db.ebean和com.avaje.ebean),它们之间的集成是一个挑战和问题。
例如,play.db.ebean.Model.Finder.fetch()方法返回com.avaje.ebean.Query
而不是play.db.ebean.Model.Finder-我发现它没有帮助,因为它会让你远离play API模型助手。调用fetch()后,显然你不能再使用Model.Finder方法-在那一点上不是什么“助手”类。
老实说,我不认为fetch功能是PlayAPI中的第一类功能,最好还是遵循AvajeAPI
在Avaje API中使用fetch()的两个示例:
// single SQL query with a fetch join
List<Order> l0 = Ebean.find(Order.class)
.fetch("customer")
.findList();
//具有fetch联接的单个SQL查询
列表l0=Ebean.find(Order.class)
.fetch(“客户”)
.findList();
及
//两个独立的SQL查询
列表l0=Ebean.find(Order.class)
.fetch(“客户”,新建FetchConfig().query())
.findList();
注意:Ebean的上一次发布/更新(bug修复的其他版本)是2010年11月6日—整整两年前。Ebean的使用率非常低。
- 切换到在Play中使用JPA 2.0实现。JPA的2.0版本确实非常强大,易于使用,并且得到了广泛的支持。这可能意味着Ebean的死亡。请注意,Play在2.0中添加了以下配置功能(1.1中不存在)-暗示Play正在向任何提供商对JPA的更全面支持迈进。
一旦你这样做了,停止使用play.db类和com.avaje类——我建议你使用100%的javax.persistence类
我查看了[link],但我没有使用Hibernate(因此@Fetch不可用)。我不明白为什么在这里使用duble
@
。@@manytone
对不起。这是一个拼写错误。我已经更正了。你也可以粘贴角色类吗?尝试定义和使用getter,即在实体中使用getter而不是公共字段,以及user.getRole().getName()
在视图中。简单的解决方案是使用getter/setter,而不是直接访问字段。我还必须修改模板以使用访问器名称,即,'@usr.role.name'变为'@usr.getRole.getName'-恐怕不太可读。因为我不必坚持使用Ebean,我想我将转向正确的JPA实现。Tha格伦!
// 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();