Java 双向关系

Java 双向关系,java,entity-framework,hibernate,jpa,eclipselink,Java,Entity Framework,Hibernate,Jpa,Eclipselink,我试图在用户和地址之间建立双向关系 用户1------------>*地址 但是 地址1------->1个用户 我在网上查到了这些信息 对于一对一的双向关系,拥有方 对应于包含相应外键的一侧 双向关系的反向侧必须指其 通过使用OneTONE的mappedBy元素拥有一方, 一个或多个注释。mappedBy元素指定 实体中作为所有者的属性或字段 关系 但是如果我按照信息进行,那么 我需要在用户实体上使用Mapped By,其中Set保持一个omany映射 同时,我需要使用Mapped By

我试图在用户和地址之间建立双向关系

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

但是

地址1------->1个用户

我在网上查到了这些信息

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

  • 双向关系的反向侧必须指其
    通过使用OneTONE的mappedBy元素拥有一方,
    一个或多个注释。mappedBy元素指定 实体中作为所有者的属性或字段
    关系

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

我需要在用户实体上使用Mapped By,其中Set保持一个omany映射 同时,我需要使用Mapped By on Address实体,其中用户持有OneTONE映射

注意:但是用户地址实体上的@JoinColumn可以正常工作。如果我在用户实体或地址实体上使用mappedBy,我会得到一个异常,说明

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

我对如何使用mapped 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>

@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
...
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“user”)
专用地址;
} 
@实体
公共课堂演讲{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
...
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“userid”,nullable=false)
私人用户;
}

问题是
@OneToMany
只能作为反
@ManyToOne
,而不能作为
@OneToOne
@OneToOne
只能由另一个
@OneToOne
映射,请查看javadoc中的这些方法

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

@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
...
@OneToMany(mappedBy=“用户”)
专用地址;
} 
@实体
公共课堂演讲{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
...
@多通(可选=假)
@JoinColumn(“您的外键名”)
私人用户;
}

发布您的用户和地址类或其中至少相关部分的注释。这将更容易看到问题所在。我已经发布了一个答案,看看我对另一个问题的回答(向下滚动问题直到接受答案后也可以看到我的帖子),了解更多关于拥有方的含义、如何使用、陷阱的信息,etc->@jhadesdev:您提供的链接通过使用ManyTone和OneToMany的示例来描述Mapped的用法。但是在我的例子中,它是manytone和onetomany如果一个用户有许多地址,那么根据定义,反向关系是manytone-许多地址引用单个用户。在数据库中,这意味着地址表有一个指向用户表的外键。请参见示例和解释,但jhadesdev给出的答案似乎是正确的。在Address Entity中,用户是OneToOne而不是ManyToone。我已经发布了一些详细信息,我认为我提出的映射为您提供了所需的含义
@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;
}