我正在尝试建立用户和地址之间的双向关系,
用户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>
答案 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;
}