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();
}
@Id表示这是一个标识符。在你的课堂上,Id是用户名,而不是empId。移动Id注释。 –