2015-10-01 19 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; 
相关问题