[英]JPA managed mapping with different entities error
我有一個表單,這個表單需要更新我的記錄,但顯然沒有更新,我得到以下錯誤消息。 在4天內處理此異常,我決定提問。 如果您需要額外的信息,我可以添加一些。
JSP例外;
MergeContext#attempt to create managed -> managed mapping with different entities: [main.model.Users#1]; [main.model.Users#1]; nested exception is java.lang.IllegalStateException: MergeContext#attempt to create managed -> managed mapping with different entities: [main.model.Users#1]; [main.model.Users#1]
Java例外;
java.lang.IllegalStateException: MergeContext#attempt to create managed -> managed mapping with different entities: [main.model.Users#1]; [main.model.Users#1]
控制器; 它從表單獲取位置用戶和域信息並將其保存到DB;
@PostMapping("/save-personel-info")
public String savePersonelInfo(@RequestParam int id, HttpServletRequest request, @ModelAttribute("Users") Users users, @ModelAttribute("Positions") Positions positions, @ModelAttribute("Domains") Domains domains, ModelMap model){
usersService.save(users);
request.setAttribute("mode", "MODE_USERS");
return "redirect:/index";
}
服務;
@Service
@Transactional
public class UsersService {
public void save(Users users){
usersRepository.save(users);
}
}
形成;
<form:form method="POST" action="/save-personel-info" modelAttribute="Users">
<tr>
<form:input id="1-1-0" type="hidden" class="form-control" path="id"/>
<td><form:input id="1-1-0" type="text" class="form-control" path="username" /></td>
<td><form:input id="1-1-0" type="text" class="form-control" path="mail" /></td>
<td>
<form:select path="Positions" class="form-control">
<form:options items="${Pst}" itemValue="id" itemLabel="position_name" />
</form:select>
</td>
<td>
<form:select path="Domains" class="form-control">
<form:options items="${Domains}" itemValue="id" itemLabel="domain_name" />
</form:select>
</td>
</tr>
<input type="submit" value="Submit" />
</form:form>
用戶類;
@Component
@Entity
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;
public String username;
public String mail;
@Temporal(TemporalType.DATE)
public Date enrolment_date;
@ManyToOne(cascade = CascadeType.ALL)
public Domains domains;
@ManyToOne(cascade = CascadeType.ALL)
public Positions positions;
@OneToMany(targetEntity = UserLanguages.class, mappedBy = "users", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<UserLanguages> userlanguages = new HashSet<UserLanguages>();
@OneToMany(targetEntity = UserCertificates.class, mappedBy = "users", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<UserCertificates> usercertificates = new HashSet<UserCertificates>();
@OneToMany(targetEntity = UserKnowledge.class, mappedBy = "users", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<UserKnowledge> userknowledge = new HashSet<UserKnowledge>();
“使用不同實體進行托管映射”的含義是什么?我研究了這個錯誤消息,但我想沒有人得到這個錯誤。 休眠-ORM
此錯誤消息表明Hibernate已檢測到無效的“托管實體” - >“托管實體”映射,其中key!= value。
MergeContext
存儲托管實體到合並實體的映射(反之亦然),我猜你有兩個不同的托管實體同時加載,表示數據庫中的相同記錄(這就是為什么你可以得到這個錯誤)。 (來源: Hibernate Core分析的內部源代碼 )
從提供的示例中很難說另一個Users
實體。 所以我在這里寫一些想法:
可以在Domains
, Positions
, UserLanguages
, UserCertificates
或UserKnowledge
類中定義Users
實體。 如果您在CascadeType.ALL
/ CascadeType.PERSIST
找到它,請刪除cascade
屬性。
如果您正在某個地方使用集合中的Users
實體並嘗試保留它,則可能還會遇到此錯誤。 覆蓋Users
類的equals()
和hashCode()
方法,並使用Set
來確保對象唯一性。 equals()
方法可能與比較id一樣簡單:
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Users that = (Users) o; return getId() == that.getId(); } @Override public int hashCode() { return Long.valueOf(getId()).hashCode(); }
仔細查看程序中的其他Users
實體,並執行session.evict(users)
以從會話緩存中刪除對象實例。
有時它只是Hibernate中的一個錯誤:
https://hibernate.atlassian.net/browse/HHH-12439?attachmentViewMode=gallery
描述
根據實體的初始化順序,級聯合並失敗並出現IllegalStateException,如:08:26:15,502 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034: EJB Invocation failed on component Bean for method public abstract void org.jboss.playground.BeanRemote.errorTest(java.lang.Long,java.lang.String): javax.ejb.EJBException: java.lang.IllegalStateException: MergeContext#attempt to create managed -> managed mapping with different entities: [org.jboss.playground.Frd#9]; [org.jboss.playground.Frd#9]
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.