【问题标题】:Issue with One to One Mapping in Hibernate?Hibernate中的一对一映射问题?
【发布时间】:2018-05-03 07:56:21
【问题描述】:

我刚开始使用 hibernate 4(注释),我有以下三个具有一对一和一对多关系的模型类。`

    @Entity
@Table(name = "USERS",uniqueConstraints = {@UniqueConstraint(columnNames={"EMAIL_ID"})})
public class UserBasicInfo implements Serializable{


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="userId")
    private Long userId;

    @Column(name="EMAIL_ID")
    private String emailId;
    @Column(name="PASSWORD")
    private String password;


    @OneToMany(fetch = FetchType.LAZY, mappedBy="userBasicInfo",cascade = CascadeType.ALL)
    private Set<UserDeviceInfo> userDeviceInfo;

    @OneToOne(mappedBy="userBasicInfo",cascade = CascadeType.ALL)
    private UserAdvancedInfo userAdvancedInfo;

///////// Getter setters 
}

@Entity
@Table(name = "USERS_ADVANCED_DETAILS")
public class UserAdvancedInfo implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ADVANCED_INFO_ID")
    private Integer advancedInfoId;
    @Column(name="GENDER")
    private Gender gender;
    @Column(name="UNIT_OF_MEASUREMENT")
    private UnitOfMeasurement unitOfMeasurement;
    @Column(name="HEIGHT")
    private Double height;


    @OneToOne
    @JoinColumn(name="userId",  insertable = true, updatable = true, nullable = true)
    private UserBasicInfo userBasicInfo;

    ////////////////////////  Getter and Setter ////////////////////////
}

基于上述模型类,我有两个不同的 REST API。 在第一个 API 中,只会插入基本信息,并且工作正常。

但在第二个 API 中,我必须根据 UserBasicInfo 的主键更新 On UserAdvancedInfo。 我使用了 update、merge、saveOrUpdate,但不是更新数据,这些方法每次都插入一个新行。 请帮帮我。

谢谢,

【问题讨论】:

  • 您的第一个服务只是插入基本信息,因此不会在 UserAdvancedInfo 中插入任何行。对吗?
  • 是的!正确的@YogeshHShenoy
  • 因此,当您使用第二个服务时,UserAdvanceInfo 将有一个新行和 UserBasicInfo 表,UserAdvanceInfo 的新 id 将被更新。您的问题是 UserBasicInfo 表中有一个新条目?是吗?
  • 不,问题是 UserAdvanceInfo 表中有一个新条目。
  • 我没有在 UserBasicInfo 中更新 UserAdvanceInfo 的 id。

标签: java hibernate spring-mvc spring-data-jpa hibernate-mapping


【解决方案1】:

要更新实体,您需要将主键设置为 UserAdvancedInfo 对象,并将具有主键的 UserBasicInfo 对象设置为 UserAdvancedInfo 对象:

UserAdvancedInfo info = new UserAdvancedInfo();
UserBasicInfo userInfo =new UserBasicInfo();
info.setUserBasicInfo(userInfo);

Hibernate 检查主键以进行更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2012-04-21
    相关资源
    最近更新 更多