更新hibernate JPA

时间:2011-06-11 17:26:16

标签: hibernate jpa-2.0

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  

2 个答案:

答案 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...
}

注意我们如何使用完整的实体类,而不仅仅是外键。

进一步阅读The Java EE 6 Tutorial

答案 1 :(得分:2)

如果项目标识是主键和对象的标识符,则不应更改它。更改主键意味着所表示的对象更改为完全不同的对象。

JPA假定主键已修复。读取,更新和删除操作通过它的id识别有问题的对象。如果更改对象的id并执行更新,则JPA会更新一些完全不同的对象(这可能会导致异常),或者根本找不到要更新的对象。

为了强调这一点,JPA规范禁止更改主键。 Hibernate还可以从任何生成的更新语句中排除主键。请参阅JSR-317

的第28页
  

唯一的主键值   标识一个实体实例   持久化上下文和   EntityManager操作如上所述   在第3章“实体操作”中。该   应用程序不得更改该值   主键(包括不更改作为主键的可变类型的值或复合主键的属性)。行为   如果发生这种情况,则是未定义的(实现可能,但不是必需的,抛出异常。便携式应用程序不得依赖任何此类特定行为。)

要完成所需的结果,您应删除旧对象并创建一个新对象。