JPA双向关系

时间:2014-04-16 18:17:32

标签: java entity-framework hibernate jpa eclipselink

我正在尝试建立用户和地址之间的双向关系,

用户1 ----------> *地址

但是

地址1 -------> 1位用户

在上网时我得到了这些信息

  • 对于一对一的双向关系,拥有方 对应于包含相应外键的一侧

  • 双向关系的反面必须参考其中 通过使用OneToOne的mappedBy元素来拥有一面,
    OneToMany或ManyToMany注释。 mappedBy元素指定 作为所有者的实体中的财产或字段 关系。

但如果按照信息进行,那么

我需要在用户实体上使用Mapped By,其中Set< Address>举行OnetoMany映射 同时我需要在地址实体上使用Mapped By,其中用户持有OnetoOne映射

注意:但是@JoinColumn在地址实体上的用户工作正常。如果我在User Entity或Address Entity上使用mappedBy,我得到了说明

的异常
  

“实体类[class com.entity.User]中的属性[addresses]具有   [User]的mappedBy值,在其拥有的实体中不存在   class [class com.entity.Address]。如果拥有实体类是a   @MappedSuperclass,这是无效的,你的属性应该是   引用正确的子类。“

我很担心如何使用映射的By来实现这种双向关系。

更新:

<pre>
@Entity
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    protected Long id;
    ...
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,mappedBy="user")
    private Set<Address> adresses;
} 


@Entity
public class Address {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    protected Long id;
    ...
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "userid", nullable = false)
    private User user;
}
</pre>

1 个答案:

答案 0 :(得分:1)

问题是@OneToMany只能反向@ManyToOne,而不是@OneToOne@OneToOne只能映射到另一个@OneToOne,请检查javadoc中的那些方法。

下面的映射为您提供了您想要的含义:一个用户可以拥有多个地址,但一个地址只能使用@JoinColumn中指定的外键中的id引用一个用户:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    protected Long id;
    ...
    @OneToMany(mappedBy="user")
    private Set<Address> adresses;
} 


@Entity
public class Address {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    protected Long id;
    ...
    @ManyToOne(optional=false)
    @JoinColumn("your_foreign_key_name")
    private User user;
}