2

我是Ebean世界的新手,在设置实体之间的关系时遇到一些困难。如何设置表格之间的关系Ebean/Play框架

我基本上有两个类,UserCar

一个用户可以有几个(所以我想OneToMany)和车可以属于一个用户(所以我猜OneToOne)。

如何链接这两个实体?这是我到目前为止已经完成

用户

@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 Car extends Model{ 
    @Id 
    @GeneratedValue 
    public int id; 
    @OneToOne(cascade = CascadeType.ALL) 
    public User user; 
} 

而且我得到以下错误

的PersistenceException:错误models.User.car找不到映射 财产[网友]在[models.Car]

有人能解释我清楚如何使用注释的正确方法(文档非常差),并告诉我,为什么我得到这个错误?

+0

错误的映射两个实体之间表示彼此之间的不同关系 – silentprogrammer 2015-03-02 16:22:15

回答

6

你猜错了:)

User应该有辆@OneToMany关系,以便:

@OneToMany(mappedBy = "user", cascade=CascadeType.ALL) 
public List<Car> car = new ArrayList<Car>(); 

,而你的Car应该有一个@ManyToOne关系:

@ManyToOne(cascade = CascadeType.ALL) 
public User user; 

上照顾@OneToMany annota的mappedBy属性重刑:你需要告诉Ebean外键在相关类中的位置。

+0

谢谢!你能解释我更多的mappedBy参数吗?这是一个随机的名字吗?我不明白我应该如何以及何时使用它。 – Mornor 2015-03-02 16:36:42

+1

https://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html – davide 2015-03-02 18:13:44

+0

在这种情况下,mappedBy不是必需的,因为它可以被推断。 – Shanness 2015-03-04 14:30:21

1

用户

@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这里代表关系的所有者是双向的关系很重要。

认为在正常情况下,一辆汽车可以存在,而没有拥有它的用户意味着用户是关系中的所有者。因此,在您的情况下,用户是关系的所有者。 Mapped By

但上面的代码将无法正常工作The attribute mappedBy is undefined for the annotation type ManyToOne

在这种情况下@JoinColumn进入画面。Join Column

+0

我想最后得到的逻辑。没有用户的汽车不能存在,这意味着用户是关系的所有者,对吗? – Mornor 2015-03-02 21:36:36

+1

@Mornor你是对的。实体是一个POJO(普通的老java对象),所以你可以把它和OOP类似,就像我们用来学习的父类和子类一样。在你的关系中你应该小心使用级联,就像我的回答I只将级联类型all(表示坚持,删除等)给用户,所以如果你删除用户,所有相应的汽车将被删除,但你不想在汽车中的行为(这完全取决于你的关系)。 – silentprogrammer 2015-03-03 05:05:31

+0

您将mappedBy写入Car类。因此,关系的所有者是用户(因为没有用户的汽车就不能存在)。简而言之,mappedBy必须写在不是所有者的类中,对吗? ManyToOne注释未定义MappedBy。 – Mornor 2015-03-03 08:09:02