通过getter查找持久化对象

时间:2011-05-04 20:57:02

标签: model-view-controller jpa playframework

假设我有2个模型

Public class Bus extends Model{

    @OneToMany(mappedBy="bus")
    private List<Passenger> passengers;

    public Bus(passengers){
        this.passengers=passengers;
    }

    public List<Passenger> getPassengers(){
        return passengers;
    }
}

public Class Passenger extends Model{

    @ManyToOne
    private Bus bus;

    public Passenger(Bus bus){
        this.bus=bus;
    }
}

我可以使用控制器方法使用吸气剂查找公交车上的所有乘客。例如:

public static void getPassengers(Long busId){
    Bus bus = Bus.findById(busId);
    List<Passengers> pList = bus.getPassengers();
}

我在实际播放的网络应用程序中尝试过,但返回的列表大小始终为0.

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我可以使用控制器方法使用吸气剂查找公交车上的所有乘客吗?

是的,你可以。但我认为问题不是使用吸气剂,而是你没有正确构建模型。

我在你的例子中看到了3个问题:

  1. 在您的控制器操作getPassengers(Long busId)中,您需要将List<Passengers>更改为List<Passenger>(单数“乘客”)

  2. Bus模型类中,您需要公开passengers或声明公开制定者。表演!”方法是将字段声明为public,让框架为您生成getter和setter。你宣布自己的getter和setter的唯一原因是你需要添加一些逻辑。

  3. Passenger模型类中,您需要公开bus

  4. 以下是我修复代码的方法:

    public class Bus extends Model{
    
        @OneToMany(mappedBy="bus")
        public List<Passenger> passengers;
    
        public Bus(passengers){
            this.passengers=passengers;
        }
    
        // No need for getters or setters, but we'll add a getter for the sake of this question:
        public List<Passenger> getPassengers() {
            return this.passengers;
        }
    }
    
    public class Passenger extends Model{
    
        @ManyToOne
        public Bus bus;
    
        public Passenger(Bus bus){
            this.bus = bus;
        }
    }
    

    你的控制器动作:

    public static void getPassengers(Long busId){
        Bus bus = Bus.findById(busId);
        List<Passenger> pList = bus.getPassengers();
        render(pList); // or whatever rendering you want to do
    }
    

    如果这不能解决您的问题,那么您无法正确加载数据。您应该发布正在运行的代码来实际创建记录 - 无论是加载YAML文件还是其他任何内容。