2015-10-01 21 views
1

我最近改變了我的表單字段在我的HTML。根據請求參數,在我的servlet中改變了abit。我沒有改變我的mysql數據庫或用戶類或任何其他休眠規範中的任何內容。現在我突然得到這個錯誤?這個類的ID必須手動分配嗎?

我在想它與我的@Id是一個字符串有關嗎?但是在這些變化之前,這對我來說很好。所以對我來說這似乎很奇怪,爲什麼它會突然開始竊聽我,因爲我沒有改變任何與休眠相關的東西。

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.Tooblo.User 
    org.hibernate.id.Assigned.generate(Assigned.java:34) 
    org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101) 
    org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) 
    org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) 
    org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 
    org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:774) 
    org.hibernate.internal.SessionImpl.persist(SessionImpl.java:747) 
    org.hibernate.internal.SessionImpl.persist(SessionImpl.java:752) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:338) 
    com.sun.proxy.$Proxy64.persist(Unknown Source) 
    com.Tooblo.DAOImplements.persist(DAOImplements.java:18) 
    com.Tooblo.eventHandler.createProfileIndividual(eventHandler.java:226) 
    com.Tooblo.eventHandler.doGet(eventHandler.java:70) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

我的用戶類

@Entity 
@Table(name="user") 
public class User { 


    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long empId; 

    @Id 
    private String username; 
    private String firstname; 
    private String lastname; 
    private String organisation; 
    private String password; 
    private String email; 

    @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST } ) 
    @JoinTable(
      name = "user_marker", 
      joinColumns = {@JoinColumn(name = "username")}, 
      inverseJoinColumns = {@JoinColumn(name = "marker_id")}) 
    private Set<Marker> bookmarks = new HashSet<>(); 

    public User() { 

    } 

    public User(String username, String password, String email) { 
     this.username = username; 
     this.password = password; 
     this.email = email; 
    } 

... setter和ormitted干將。

我的servlet方法。

 String username = request.getParameter("username"); 
     String password = request.getParameter("password"); 
     String email = request.getParameter("email"); 

     User user = new User(username, password, email); 

     DAO.persist(user); 

而我在我的堅持DAO方法

@Override 
    public void persist(Object entity) { 
     session = HibernateUtil.getSessionFactory().getCurrentSession();  
     session.beginTransaction(); 
     session.persist(entity); 
     session.getTransaction().commit(); 
    } 
+0

@Id表示這是一個標識符。在你的課堂上,Id是用戶名,而不是empId。移動Id註釋。 –

回答

1

由於您使用MySQL服務器,它不支持AUTO_INCREMENT非主鍵屬性和你的主鍵是用戶名

這樣你就可以在你的實體類,以及在你的DB模式更改主鍵EMPID場。

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private long empId; 
相關問題