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註釋。 –