java - 尝试将对象合并到数据库时无法通过反射设置字段值

标签 java spring hibernate spring-boot jpa

我有一个 CompanyUser.java 类,它充当公司和用户上多对多关系的内部表。现在我想更新一个值(权限级别),但这样做时我收到此错误。我检查了所有 getter 和 setter。我的 CompanyUser.java 类如下所示。

@Entity
public class CompanyUser
{

   @EmbeddedId
   private CompanyUserId id;

   @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @MapsId("companyId")
   private Company company;

   @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
   @MapsId("userId")
   private User user;

   @Column(name = "privilege_level")
   private Integer privilegeLevel = CompanyPrivilegeLevel.DEFAULT.getValue();

   public CompanyUser() {}

   public CompanyUser(Company company, User user, Integer priveligeLevel)
   {
      this.company = company;
      this.user = user;
      this.privilegeLevel = priveligeLevel;
      this.id = new CompanyUserId(user.getId(), company.getId());
   }
 ... Getters and Setters ...
}

嵌入的CompanyUserId.java:

@Embeddable
public class CompanyUserId implements Serializable
{

  @Column(name = "user_id")
  private int userId;
  @Column(name = "company_id")
  private int companyId;

  public CompanyUserId() {}

  public CompanyUserId(int userId, int companyId)
  {
    this.userId = userId;
    this.companyId = companyId;
  }
  ... Getters and setters & equals and hashCode method ...
}

抛出了 nullPointer 异常,所以我尝试更改

@EmbeddedId private CompanyUserId id;

@EmbeddedId private CompanyUserId id = new CompanyUserId();

但是当我这样做时,我收到“Hibernate 错误:具有相同标识符值的不同对象已与 session 关联”错误。

提前致谢。

抛出异常:

java.lang.NullPointerException: null
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57) ~[na:na]
    at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:75) ~[na:na]
    at java.base/java.lang.reflect.Field.set(Field.java:780) ~[na:na]
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:368) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at com.ewa.urbananalytics.ewabackend.repository.JpaCompanyUserRepository.save(JpaCompanyUserRepository.java:22) ~[classes/:na]

编辑: 感谢@locus2k,我成功让它工作了!我检索该对象的方式出了问题。我认为这不是最有效的方法,但目前来说,它是有效的。

@PostMapping("/company/user/save")
@Transactional
public void saveCompanyUser(@RequestBody CompanyUser cu)
{
    CompanyUserId companyUserId = new CompanyUserId(cu.getUser().getId(), cu.getCompany().getId());
    CompanyUser foundCU = companyUserRepository.findById(companyUserId);
    foundCU.setPriveligeLevel(cu.getPrivilegeLevel());
    companyUserRepository.save(foundCU);
}

最佳答案

您似乎没有正确检索 CompanyUser 进行更新。

您要做的就是先设置要更新的 CompanUserId 值,然后查询该对象,更新结果,然后保留它。

如果您使用 SpringRepository,您可以执行以下操作:

CompanyUserId id = new CompanyUserId(1, 1);

CompanyUser user = repo.findById(id);
user.setPrivilegeLevel(1);
repo.save(user);

只需确保进行必要的错误处理即可。

如果您使用 hibernate 进行查询,您的查询将如下所示:

String query = "SELECT cu FROM CompanyUser cu WHERE cu.id = :id";

CompanyUserId id = new CompanyUserId(1, 1);
TypedQuery<CompanyUser> q = entityManager.createQuery(query, CompanyUser.class);
q.setParameter("id", id);

CustomerUser user = q.getSingleResult();
user.setPrivilegeLevel(1);
entityManager.persist(user);

确保删除 @EmbeddedId private CompanyUserId id = new CompanyUserId(); 并将其设置回 @EmbeddedId private CompanyUserId id;

关于java - 尝试将对象合并到数据库时无法通过反射设置字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364567/

相关文章:

java - 是打开不同的端口更好,还是打开一个带有标识符的端口更好(或者其他)?

java - 设置 spring+hibernate maven 项目时遇到问题?

java - 从 jar 文件写入 $HOME

java - 将蛇形大小写转换为驼峰大小写以进行 Spring 分页和排序

java - PSQL异常 : This connection has been closed - Spring Boot + AWS RDS + Postgres

java - Spring XML View 解析器配置

oracle - JDBC 类型 : -9 没有方言映射

hibernate 问题 - "Use of @OneToMany or @ManyToMany targeting an unmapped class"

Javafx - 在看到之前界限为零

java - 一些 Recyclerview 项目相互影响