假设我有一个用户表,主键是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);
并且它不会更新用户,而是将新用户记录插入用户表。
那么如何更新现有用户记录并逐步更新引用的礼品记录的用户字段?
答案 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
中。