我最近在html中更改了表单字段。并根据请求参数更改了我的servlet中的abit。我没有更改我的mysql数据库或用户类或任何其他hibernate规范中的任何内容。现在我突然收到这个错误了?
我认为这与我的@Id是一个字符串有什么关系?但在这些变化之前,这对我来说很好。所以我觉得为什么它突然开始烦我,因为我没有改变任何与休眠相关的东西,这似乎很奇怪。
std::is_assignable<X*&, Y*>::value
// ~^~
我的用户类
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)
......定居者和吸气者。
我的servlet方法。
@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;
}
我的DAO中的持久方法
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);
答案 0 :(得分:1)
由于您使用的是mysql服务器,因此非主键属性不支持 AUTO_INCREMENT ,而您的主键是用户名
因此您可以将主键更改为Entity类和DB模式中的 empId 字段。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long empId;