最近,我在html中更改了表单字段。并根据请求参数更改了servlet中的abit。我没有更改mysql数据库或用户类中的任何内容,也没有更改任何其他hibernate规范。现在我突然发现了这个错误?
我想这和我的@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;
}...Setters和getters或已发送。
我的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);我坚持的方法在我的刀
@Override
public void persist(Object entity) {
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.persist(entity);
session.getTransaction().commit();
}发布于 2015-10-01 17:36:04
由于您使用的是mysql服务器,所以它不支持AUTO_INCREMENT的非主键属性,您的主键是用户名。
因此,您可以在实体类和DB架构中将主键更改为empId字段。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long empId;https://stackoverflow.com/questions/32893434
复制相似问题