我有一个 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/