Playframework 急切的获取似乎没有加入

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

我在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=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();