java - 这个类的 ids 必须手动分配吗?

标签 java hibernate

我最近更改了 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/

相关文章:

java - 如何在 DCIM 目录(范围存储)Android Q 中创建隐藏文件夹,即 .MyFolder [(dot)MyFolder]

xml - 从 XSD 生成 hibernate 实体 bean

java - hibernate 中的createSQLQuery使用Prepared Statement?

java - hql 去掉参数值的括号

java - Jsch ssh 到 Raspberry Pi 不执行任何操作

java - 我可以只在引用类型上使用泛型吗?

java - 如何仅使用名称而不是路径来检索 S3 对象?

java - DefaultHttpHeaderMapper 允许自定义,但不执行排除逻辑

java - JPA 中的 @Query 为 STR TO DATE 提供 null 输出

hibernate - 使用条件 API 在 JPA 2.1 中批量删除