【问题标题】:How to set relationship between tables Ebean/Play frameworkEbean/Play框架如何设置表之间的关系
【发布时间】:2015-03-02 16:16:45
【问题描述】:

我是 Ebean 世界的新手,在设置实体之间的一些关系时遇到了一些困难。

我基本上有两个类,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 上的错误找不到 mappedBy [models.Car] 中的属性 [users]

有人可以清楚地解释我如何正确使用注释(文档很差),并告诉我为什么会出现这个错误吗?

【问题讨论】:

  • 错误的映射两个实体表示彼此之间的不同关系

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


【解决方案1】:

你猜错了:)

您的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 注释中的mappedBy 属性:您需要告诉Ebean 外键在相关类中的位置。

【讨论】:

  • 谢谢!你能解释一下mappedBy参数吗?这是一个随机的名字吗?我不明白应该如何以及何时使用它。
  • 在这种情况下不需要mappedBy,因为它可以被推断出来。
【解决方案2】:

用户

@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

【讨论】:

  • 我想终于明白逻辑了。没有用户,汽车就无法存在,这意味着用户是关系的所有者,对吗?
  • @Mornor 你是对的。Entity 是一个 POJO(普通的旧 java 对象),所以你可以将它与我们用来研究的父类和子类等 OOP 相关联。另外你应该小心使用级联您的关系就像我的回答一样,我只将级联类型全部(意味着持久,删除等)放入用户,所以如果您删除用户,所有相应的汽车都将被删除,但您不希望汽车中的这种行为(这完全取决于您的关系)。
  • 您将 mappedBy 写入 Car 类。所以关系的所有者是用户(因为没有用户,汽车就不能存在)。简而言之,mappedBy 必须写在不是所有者的类中,对吧?未定义 ManyToOne 注释的 MappedBy。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2012-09-21
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多