Java 更新jpa中实体的所有字段

Java 更新jpa中实体的所有字段,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个实体用户和项目,他们有“一对多”的关系,我想找到用户,然后找到属于用户的特定项目,然后更新它,但我不能。 框架Struts2+Hibernate @实体(name=“User”) @表(name=“users”) 公共类用户实现可序列化{ @身份证 @列(name=“user\u id”,columnDefinition=“number”) @SequenceGenerator(name=“seq”,sequenceName=“gen”) @GeneratedValue(策略=Gener

我有两个实体用户和项目,他们有“一对多”的关系,我想找到用户,然后找到属于用户的特定项目,然后更新它,但我不能。 框架Struts2+Hibernate

@实体(name=“User”)
@表(name=“users”)
公共类用户实现可序列化{
@身份证
@列(name=“user\u id”,columnDefinition=“number”)
@SequenceGenerator(name=“seq”,sequenceName=“gen”)
@GeneratedValue(策略=GenerationType.AUTO,generator=“seq”)
私有int-id;
@基本的
@列(name=“user\u name”,columnDefinition=“nvarchar2(20)”)
私有字符串用户名;
@基本的
@列(name=“password”,columnDefinition=“nvarchar2(20)”)
私有字符串密码;
@基本的
@列(name=“创建日期”,columnDefinition=“日期”)
私人日期创建日期;
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“user\u id”)
私人名单项目;
公共列表getProjectses(){
返回项目;
}
公共项目集(列表项目集){
this.projectses=projectses;
}
和项目实体

@实体(name=“项目”)
@表(name=“项目”)
公共类项目实现可序列化{
@身份证
@列(name=“project\u id”,columnDefinition=“number”)
@SequenceGenerator(name=“projectSeq”,sequenceName=“projectGen”)
@GeneratedValue(策略=GenerationType.AUTO,generator=“projectSeq”)
私有int投影;
@基本的
@列(name=“project\u name”,columnDefinition=“nvarchar2(20)”)
私有字符串projectName;
@基本的
@列(name=“project\u description”,columnDefinition=nvarchar2(20)”)
私有字符串项目描述;
@基本的
@列(name=“开始日期”,columnDefinition=“日期”)
私人日期开始日期;
@基本的
@列(name=“到期日”,columnDefinition=“日期”)
私人约会日期;
@基本的
@列(name=“project\u status”,columnDefinition=“nvarchar2(20)”)
私有字符串状态;
@基本的
@列(name=“项目金额”,columnDefinition=“编号(8)”)
私人投资额;
获取用户对象时,您将使用与该用户关联的一组项目来获取它

更新所需的数据:-

List<Project> userProjects = u.getProjectses();   
for(int i = 0 ; i < userProjects.size() ; i++){
   Project p = userProjects.get(i);
   entityManager.getTransaction().begin();
   p.setProjectName("test"); 
   entityManager.merge(p); 
   entityManager.getTransaction().commit(); 
}
List userProjects=u.getProjectses();
对于(int i=0;i
考虑到三个更正,这可能会使您的代码表现良好:

  • 使用代替HQL按id查找实体

  • 只使用
    @Basic
    @Column
    中的一个(我更喜欢),没有必要对单个元素同时使用这两个元素

  • 如果错误为“value对于column来说太长”,那么可能是时候检查
    Project
    中的某些元素是否超过
    columnDefinition
    中定义的20个字符了

检查
项目
实体中字符串元素的长度,如果有超过20个字符,比如500个,则修改这些元素的
列定义
,例如:

@Column(name = "project_description", columnDefinition = "nvarchar2(500)")
private String projectDescription;

我还建议在这些修改之后删除表(以允许JPA根据新定义创建新表),或者在DB中手动修改它们的定义。

但我不能--请详细说明,您是如何尝试创建的,发生了什么错误,等等。join column be project_id?@SashaSalauyou我的更新方法有一个参数(用户)然后用户userProject=(User)entityManager.createQuery(“从用户u中选择u,其中u.id=:userId”).setParameter(“userId”,User.getId()).getSingleResult();userProject.setProject(User.getProject);entityManager.persist(userProject);错误是值对于第1列太长。简化问题2的类。将代码放回问题本身的注释中3。正确设置代码格式4。错误对于人们理解问题很重要。将有意义的部分提取出来并发布在此处!
@Column(name = "project_description", columnDefinition = "nvarchar2(500)")
private String projectDescription;