Spring数据jpa的ManyToOne关系:如何对引用的主键进行级联更新?

时间:2016-06-24 06:18:33

标签: java hibernate jpa spring-data-jpa

假设我有一个用户表,主键是openId,它被引用为另一个表的外键:

@Entity
public class User implements Serializable {
  @Id
  String openId;
  String nickname;
  String city;
}

另一个表引用用户表:

@Entity
public class Gift {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;
  @ManyToOne
  User user;
  String name;
  String image; 
  Long price;
}

现在根据业务变化,我需要更改用户的openId,我想知道这是更新这些现有引用礼品记录的方法。

我做了一些尝试:如果我首先查询用户并更改其openId,那么我将保存用户,如下面的代码:

User user = userRepo.findOne("o3sVZuA4p81wG24ph5Z5lmnrVhlc");
user.setOpenId("o3s");
userRepo.save(user);

并且它不会更新用户,而是将新用户记录插入用户表。

那么如何更新现有用户记录并逐步更新引用的礼品记录的用户字段?

2 个答案:

答案 0 :(得分:0)

以下是编辑并将对象保存到数据库的相同代码(不会将新字段添加到数据库表中)。

 //initialize you EntityManager 
 // Transaction Begin
   obj_EntityManager.getTransaction().begin()
        //and Now here is the code to Update Your Rows.
    user = v_objEm.find(User.class, ID);
    user .setPassword(prm_Password);
     // set another Fields that belongs to your
    obj_EntityManager.getTransaction().commit();
    obj_EntityManager.close();
  

注意: - 此代码与我的jpa已配置项目一起使用以更新用户表记录。

答案 1 :(得分:0)

您无法更改实体的ID 。该ID唯一标识实体对象。不同的ID =不同的实体对象。您可以手动编辑数据库中带注释的@Id列的值;但出于所有目的,该记录现在是不同的实体对象,因为它具有不同的ID 对于知道的任何框架,尽管ID具有不同的User User是相同的openID,但必须存在可用于其他内部列的其他内部列识别用户。类似于"哦,好吧,socialSecurityNumber不同但User是相同的,所以它是相同的openID"。但话又说回来,您的ID不会是socialSecurityNumber字段:您必须将@Id注释为实际的User user = userRepo.findOne("o3sVZuA4p81wG24ph5Z5lmnrVhlc"); ,以便框架知道。

事实上,在您的示例中,您正在执行此操作:

"o3sVZuA4p81wG24ph5Z5lmnrVhlc"

因此,您似乎 拥有唯一身份证User,只有您尚未在@Id中声明它。< / p>

只需从openId移除@Id注释,然后将其他字段声明为openID。这样,您就可以更新任何User的{​​{1}},并将其反映在每个Gift中。