IN休眠JPA如何更新对象? 我有一个具有两个属性的Project实体。 projectid和projectname。 这里projectid是主要的关键。现在在我的更新方法中,我应该能够修改projectid和projectname属性。查询应该类似于以下方式。
update PROJECT set ID='123',NAME='Intel' where ID='122'
我想将project_id分配给user_id。
project_table
-------------
project_id project_name
-------------------------
LK987 LockSystem
MK876 MockSystem
user_project_table
---------------------
user_id project_id
--------------------------
12343 LK987
12344 MK876
12343 TK656
12675 TK656
答案 0 :(得分:2)
不再考虑SQL,开始考虑EntityManager
。
Project p = entityManager.find(Project.class,122);
p.setId(123);
p.setName( “英特尔”);
entityManager.merge(P);
那就是说,<{>> 总是 change an entity's primary key的错误选择。
为什么要更改实体的身份?您还需要更新指向它的其他表中的所有外键。看起来像是痛苦,没有收获。您可能最好将其作为“商业密钥”(普通财产)并使用更长久的代理密钥。
如果确实需要能够更改项目的ID号,则应将主键更改为自动增加的号码。该实体看起来像这样:
@Entity
public class Project
{
@Id @GeneratedValue
private int id;
private int projectId;
private String projectName;
// getters and setters
}
您可以在项目ID(字符串,如"LK987"
)是主键的情况下执行此操作(现在我确定您理解您不应该更改) - 或者您可以单独使用autoincrement int
作为id。由你决定;我个人的偏好是自动增量方法,所以你以后就不必担心了。
您要做的是在Project
实体和User
实体之间建立关系。您应该存储实体字段(用于一对一,一对多或多对一映射)或实体集合(用于一对一),而不是存储外键字段。许多,多对一或多对多的映射。如果我理解你的需要:
User
是关系的所有者,Project
是反面的。这意味着您将使用@ManyToMany
注释,并指定@JoinTable
以及要使用的@JoinColumn
。
@Entity
public class User
{
@Id @GeneratedValue
int id; // the PK for user entities
@ManyToMany
@JoinTable(
name="user_project_table",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="project_id"))
Set<Project> projects;
// snip...
}
@Entity
public class Project
{
@Id @GeneratedValue
int id;
String projectId;
String projectName;
@ManyToMany(mappedBy="projects")
Set<User> users;
// snip...
}
注意我们如何使用完整的实体类,而不仅仅是外键。
答案 1 :(得分:2)
如果项目标识是主键和对象的标识符,则不应更改它。更改主键意味着所表示的对象更改为完全不同的对象。
JPA假定主键已修复。读取,更新和删除操作通过它的id识别有问题的对象。如果更改对象的id并执行更新,则JPA会更新一些完全不同的对象(这可能会导致异常),或者根本找不到要更新的对象。
为了强调这一点,JPA规范禁止更改主键。 Hibernate还可以从任何生成的更新语句中排除主键。请参阅JSR-317
的第28页唯一的主键值 标识一个实体实例 持久化上下文和 EntityManager操作如上所述 在第3章“实体操作”中。该 应用程序不得更改该值 主键(包括不更改作为主键的可变类型的值或复合主键的属性)。行为 如果发生这种情况,则是未定义的(实现可能,但不是必需的,抛出异常。便携式应用程序不得依赖任何此类特定行为。)
要完成所需的结果,您应删除旧对象并创建一个新对象。