簡體   English   中英

JPA管理的映射具有不同的實體錯誤

[英]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實體。 所以我在這里寫一些想法:

  • 可以在DomainsPositionsUserLanguagesUserCertificatesUserKnowledge類中定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM