我最近更改了 html 中的表单字段。并根据请求参数对我的 servlet 进行了一些更改。我没有更改 mysql 数据库或用户类或任何其他 hibernate 规范中的任何内容。现在我突然收到这个错误?
我认为这与我的 @Id 是字符串有关?但在这些变化之前,这对我来说效果很好。所以我觉得很奇怪为什么它会突然开始困扰我,因为我没有更改任何与 hibernate 相关的内容。
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 和 getter。
我的 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();
}
最佳答案
由于您使用的是 mysql 服务器,因此它不支持非主键属性的AUTO_INCRMENT,并且您的主键是用户名 .
这样您就可以将实体类和数据库架构中的 empId 字段的主键更改为。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long empId;
关于java - 这个类的 ids 必须手动分配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893434/