2017-03-12 84 views
6

Bir formum var ve bu form kaydımı güncellemeli ama görünüşe göre güncellenmiyor ve hata mesajının altına inmem gerekiyor. Bu istisnayı 4 gün içinde ele alıyorum ve bir soru sormaya karar verdim. Ek bilgiye ihtiyacınız varsa, biraz ekleyebilirim.JPA, farklı varlıklar ile eşlemeyi yönetme hatası

JSP Özel Durumu; ( )

java.lang.IllegalStateException: MergeContext#attempt to create managed -> managed mapping with different entities: [main.model.Users#1]; [main.model.Users#1] 

Denetleyici; Form Kullanıcı ve Etki Alanı bilgilerini formdan alır ve DB'ye kaydeder;

@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; ( )

<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> 

User Class; "Farklı varlıklar ile yönetilen haritalama" anlamı nedir

@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>(); 

ben bu hata mesajını araştırma ama kimse bu hatayı alıyorum sanırım. Hibernate-orm

+0

Aynı sorun. Bu sorunu zaten çözdüyseniz lütfen bildirin. – semenchikus

+0

@semenchikus Cevabıma bir göz atın – naXa

cevap

6

Bu hata iletisi, hazırda beklemenin geçersiz 'yönetilen varlık' -> 'yönetilen varlık' eşleştirmelerinin anahtar! = Değer olduğunu saptadığını söylüyor.

MergeContext, yönetilen varlıkların eşlemelerini birleştirilmiş nesnelere (ve tersi) depolar ve sanırım, bir şekilde veritabanında aynı kaydı temsil eden aynı anda yüklenen iki ayrı yönetilen varlığa sahip olursunuz (bu yüzden bu hatayı alabilirsiniz)). (Kaynak: internal source code of Hibernate Core analizi)

Zor bir tane Users varlıktır sağlanan örnekten söylemek. Bu yüzden burada birkaç fikir yazıyorum:

  • Users varlık Domains, Positions, UserLanguages, UserCertificates veya UserKnowledge sınıflarında tanımlanabilir. Orada CascadeType.ALL/CascadeType.PERSIST ile bulursanız, cascade özelliğini kaldırın.Bir koleksiyonda Users varlıklarını kullanıyorsanız ve bunu sürdürmeye çalışıyorsanız, bu hatayla da karşılaşabilirsiniz. Nesne benzersizliğini sağlamak için ve hashCode() yöntemlerini Users sınıfında geçersiz kılın ve bir Set kullanın. Programda diğer Users varlıklar için dikkatle

    @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(); 
    } 
    
  • Bak ve oturum önbellekten nesne örneğini kaldırmak için session.evict(users) yapın: equals() yöntemi karşılaştıran kimlikleri kadar basit olabilir.