更新HibernateJPA

更新HibernateJPA,hibernate,jpa-2.0,Hibernate,Jpa 2.0,在HibernateJPA中,我如何更新对象? 我有一个具有两个属性的项目实体。projectid和projectname。 这里projectd是主键。现在在我的更新方法中,我应该能够修改属性projectid和projectname。查询应该如下所示 update PROJECT set ID='123',NAME='Intel' where ID='122' 我想将项目id分配给用户id project_table ------------- project_id project_na

在HibernateJPA中,我如何更新对象? 我有一个具有两个属性的项目实体。projectid和projectname。 这里projectd是主键。现在在我的更新方法中,我应该能够修改属性projectid和projectname。查询应该如下所示

update PROJECT set ID='123',NAME='Intel' where ID='122'
我想将项目id分配给用户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  

停止用SQL思考,开始用SQL思考。 Project p=entityManager.find(Project.class,122); p、 setId(123); p、 设置名称(“英特尔”); 实体管理器合并(p)

也就是说,这几乎总是一个错误的选择

为什么要更改实体的标识?您还需要更新其他表中指向它的所有外键。似乎是一种痛苦,没有收获。您最好将其设置为“业务密钥”(普通属性)并使用更永久的代理密钥

如果确实需要更改项目的ID号,则应将主键更改为自动递增的数字。实体的外观如下所示:

@Entity
public class Project
{
    @Id @GeneratedValue
    private int id;
    private int projectId;
    private String projectName;

    // getters and setters
}


因此,您希望将项目与用户关联。 您可以在项目id(一个字符串,如
“LK987”
)是主键的地方执行此操作(现在我确信您知道您不应该更改它),或者您可以使用单独的自动增量
int
作为id。这取决于您;我个人的偏好是自动增量方法,所以你以后不用担心

您试图做的是在
项目
实体和
用户
实体之间建立关系。您应该存储实体字段(用于一对一、一对多或多对一映射)或实体集合(用于一对多、多对一或多对多映射),而不是存储外键字段。如果我了解您需要什么:

  • 每个用户可以有多个项目,每个项目可以有多个用户(因此映射是多对多的)
  • 用户知道项目,项目也可能知道用户(因此映射是双向的)。我将假定
    用户
    是关系的所有者,而
    项目
    则是关系的反面
这意味着您需要使用注释,并指定要使用的和

用户实体类
@实体
公共类用户
{
@Id@GeneratedValue
int id;//用户实体的主键
@许多
@可接合(
name=“user\u project\u table”,
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“project\u id”))
设置项目;
//剪断。。。
}
项目实体类
@实体
公共类项目
{
@Id@GeneratedValue
int-id;
弦投影;
字符串projectName;
@许多(mappedBy=“项目”)
设置用户;
//剪断。。。
}
注意我们是如何使用成熟的实体类的,而不仅仅是外键

进一步阅读:

停止用SQL思考,开始用SQL思考。 Project p=entityManager.find(Project.class,122); p、 setId(123); p、 设置名称(“英特尔”); 实体管理器合并(p)

也就是说,这几乎总是一个错误的选择

为什么要更改实体的标识?您还需要更新其他表中指向它的所有外键。似乎是一种痛苦,没有收获。您最好将其设置为“业务密钥”(普通属性)并使用更永久的代理密钥

如果确实需要更改项目的ID号,则应将主键更改为自动递增的数字。实体的外观如下所示:

@Entity
public class Project
{
    @Id @GeneratedValue
    private int id;
    private int projectId;
    private String projectName;

    // getters and setters
}


因此,您希望将项目与用户关联。 您可以在项目id(一个字符串,如
“LK987”
)是主键的地方执行此操作(现在我确信您知道您不应该更改它),或者您可以使用单独的自动增量
int
作为id。这取决于您;我个人的偏好是自动增量方法,所以你以后不用担心

您试图做的是在
项目
实体和
用户
实体之间建立关系。您应该存储实体字段(用于一对一、一对多或多对一映射)或实体集合(用于一对多、多对一或多对多映射),而不是存储外键字段。如果我了解您需要什么:

  • 每个用户可以有多个项目,每个项目可以有多个用户(因此映射是多对多的)
  • 用户知道项目,项目也可能知道用户(因此映射是双向的)。我将假定
    用户
    是关系的所有者,而
    项目
    则是关系的反面
这意味着您需要使用注释,并指定要使用的和

用户实体类
@实体
公共类用户
{
@Id@GeneratedValue
int id;//用户实体的主键
@许多
@可接合(
name=“user\u project\u table”,
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“project\u id”))
设置项目;
//剪断。。。
}
项目实体类
@实体
公共类项目
{
@Id@GeneratedValue
int-id;
弦投影;
字符串projectName;
@许多(mappedBy=“项目”)
设置用户;
//剪断。。。
}
注意我们是如何使用成熟的实体类的,而不仅仅是外键

进一步阅读:

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

JPA假设主键是固定的。读取、更新和删除操作通过其
@Entity
public class Project
{
    @Id @GeneratedValue
    int id;
    String projectId;
    String projectName;

    @ManyToMany(mappedBy="projects")
    Set<User> users;

    // snip...
}