【问题标题】:Issue on saving data into DB using play / Ebean使用 play/Ebean 将数据保存到 DB 的问题
【发布时间】:2015-03-02 14:16:46
【问题描述】:

我有 3 节课。

  1. 汽车
  2. 用户
  3. 用户汽车

这 3 个类代表我的数据库中的表。 UserCars 表链接 Car 和 Users 表,它的构造方式如下:

---用户---
整数ID
整型汽车ID
int 用户 ID
-----

我尝试使用 Users_car 表保存与其用户相关的汽车。

这是我的 3 个课程:
汽车

@Entity
public class Car extends Model{

    @Id
    @GeneratedValue
    public int id; 
    public String brand; 
    public String model; 
    public String fuel;
    public double avg_cons; // Average consumption
    public double c02_cons;  
    public double htva_price; 
    public double leasing_price; 

    public static Finder<String, Car> find = new Finder<String, Car>(
            String.class, Car.class
    ); 

}

用户

@Entity
public class User extends Model{

    @Id
    @GeneratedValue
    public int id;  
    public String name; 
    public String username; 
    public String email; 
    public String password; 
    public String phoneNumber; 
    public Timestamp inscriptionDate;
    @Transient
    public Timeline timeline;

    public User(){}
}

用户汽车

@Entity
@Table(name = "user_cars")
public class UserCars extends Model{

    @Id
    @GeneratedValue
    public int id; 
    @ManyToOne
    public int user_id;  
    @OneToOne
    public int car_id; 

    public UserCars(int userId, int carId){
        this.user_id = userId; 
        this.car_id = carId;
    }

    public static Finder<String, UserCars> find = new Finder<String, UserCars>(
            String.class, UserCars.class
    );
}

这是我保存它的方式:

public static Result saveCar(){
        // Retrieve the current username
        DynamicForm params = Form.form().bindFromRequest();
        String username = params.get("username");
        User current = User.find.where().like("username", username).findUnique(); 
        int currentUserId = current.getId(); 

        // Get data from android and save it to DB
        Car car = Form.form(Car.class).bindFromRequest().get(); 
        int currentCarId = car.id; 
        UserCars userCars = new UserCars(currentUserId, currentCarId); 

        try {
            Ebean.save(car);
            Ebean.save(userCars); 
        } catch (OptimisticLockException e) {
            e.printStackTrace();
            return internalServerError("Car registration failed"); 
        }

        return ok(); 
    }

问题是,在int currentCarId = car.id; 行,id 总是 0。 确实只有在我保存汽车 (Ebean.save(car);) 时才会增加 ID。

如何增加 ID,以便正确增加 ID 以创建正确的 UsersCars 实例?

非常感谢!

【问题讨论】:

  • 你想要达到什么目的意味着在保存并传递给 UserCars 之前猜测 Car 的 id。你能解释一下吗?
  • @singhakash 是的,这是我的问题。但这可能吗?我已经尝试在 Car 中使用静态 int,但它不起作用,而且一点也不优雅……所以是的,我需要仅在调用 Ebean.save() 时生成的 Car 的 Id。 (因为只有这个方法会增加 id)
  • 据我所知not possible.Btw 不使用 Cars 和 User 之间直接关系的具体原因?
  • @singhakash 没有特别的原因,我觉得这种方式更方便和优雅。有没有可能的解决方法?或者绕过这个问题?
  • 对不起,但我不同意。我认为最后你在 Cars 和 User 之间建立了 ManyToMany 关系。在你的情况下,你明确地创建映射表 UserCars 为什么要编写这么多创建 UserCars 等的代码而不是使用 ManyToMany 注释,它会为你做每件事。

标签: java playframework playframework-2.0 ebean playframework-2.3


【解决方案1】:

您可以在 Cars 和 User .Like 之间创建多对多关系

@Entity
public class Car extends Model{

//other fields

@ManyToMany
public List<User> users=new ArrayList<User>();

}

@Entity
public class User extends Model{

 //other fields    

@ManyToMany
public List<Car> users=new ArrayList<Car>();

}

上面的代码会自动创建第三个表 User_Cars(你可以改名字),分别有 Car 和 User 的 id。

同时检查Example

【讨论】:

  • 好吧。例如,我首先创建一个用户,然后如果我想给这个用户添加一辆车,我应该更新吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多