Java 如何在Ebean/Play框架中设置表之间的关系

Java 如何在Ebean/Play框架中设置表之间的关系,java,playframework,playframework-2.2,ebean,playframework-2.3,Java,Playframework,Playframework 2.2,Ebean,Playframework 2.3,我是埃宾世界的新手,在建立实体之间的关系时遇到了一些困难 我基本上有两个类,User和Car 一个用户可以有多辆车(因此我猜OneToMany),而一辆车可以属于一个用户(因此我猜onetomone) 如何链接这两个实体?这就是我到目前为止所做的 用户 @Entity public class User extends Model{ @Id @GeneratedValue public int id; public String name; @Man

我是埃宾世界的新手,在建立实体之间的关系时遇到了一些困难

我基本上有两个类,
User
Car

一个用户可以有多辆车(因此我猜
OneToMany
),而一辆车可以属于一个用户(因此我猜
onetomone

如何链接这两个实体?这就是我到目前为止所做的

用户

@Entity
public class User extends Model{
    @Id
    @GeneratedValue
    public int id;  
    public String name; 
    @ManyToMany(cascade=CascadeType.ALL)
    public List<Car> car = new ArrayList<Car>();
}
@Entity
public class User extends Model{
@Id
@GeneratedValue
public int id;  
public String name; 
@OneToMany(cascade=CascadeType.ALL)
public List<Car> car = new ArrayList<Car>();
}
@Entity
public class Car extends Model{

@Id
@GeneratedValue
public int id;
@ManyToOne(mappedBy="car")          //will give you an error
public User user; 
}
我得到以下错误

PersistenceException:models.User.car上出错,无法找到mappedBy [models.Car]中的属性[用户]

有人能给我解释清楚如何正确使用注释(非常糟糕的文档),并告诉我为什么会出现这个错误吗?

你猜错了:)

您的
用户
应该与汽车有
@OneToMany
关系,因此:

@OneToMany(mappedBy = "user", cascade=CascadeType.ALL)
public List<Car> car = new ArrayList<Car>();
注意
@OneToMany
注释中的
mappedBy
属性:您需要告诉Ebean外键在相关类中的位置。

User

@Entity
public class User extends Model{
    @Id
    @GeneratedValue
    public int id;  
    public String name; 
    @ManyToMany(cascade=CascadeType.ALL)
    public List<Car> car = new ArrayList<Car>();
}
@Entity
public class User extends Model{
@Id
@GeneratedValue
public int id;  
public String name; 
@OneToMany(cascade=CascadeType.ALL)
public List<Car> car = new ArrayList<Car>();
}
@Entity
public class Car extends Model{

@Id
@GeneratedValue
public int id;
@ManyToOne(mappedBy="car")          //will give you an error
public User user; 
}
mappedBy
这里表示关系的所有者,这在双向关系中很重要

在正常情况下,如果没有拥有汽车的用户,汽车能否存在意味着用户是关系中的所有者。因此,在您的案例中,用户是关系的所有者

但是上面的代码不起作用
注释类型ManyToOne的属性mappedBy未定义


在这种情况下,
@JoinColumn
进入图片。

错误的映射两个实体表示彼此之间的关系不同谢谢!你能给我解释一下mappedBy参数吗?这是一个随机的名字吗?我不知道该如何以及何时使用它。在这种情况下不需要mappedBy,因为它可以被推断出来。我想最终得到了逻辑。没有用户汽车就不可能存在,这意味着用户是关系的所有者,对吗?@Mornor你说得对。实体是一个POJO(普通的旧java对象),因此你可以将它与我们用来研究的父类和子类等OOP相关联。此外,在关系中使用cascade时应该小心,就像在我的回答中一样,我只把cascade类型全部放进去(意味着持久、删除等)给用户,因此如果您删除用户,所有相应的汽车都将被删除,但您不希望汽车出现这种行为(这完全取决于您的关系)。您将mappedBy写入了汽车类。因此,关系的所有者就是用户(因为汽车不能没有用户而存在).简而言之,mappedBy必须在非所有者的类中编写,对吗?mappedBy对于许多注释都是未定义的。