首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个类的ids必须手动分配吗?

问这个类的ids必须手动分配吗?
EN

Stack Overflow用户
提问于 2015-10-01 17:30:12
回答 1查看 92关注 0票数 1

最近,我在html中更改了表单字段。并根据请求参数更改了servlet中的abit。我没有更改mysql数据库或用户类中的任何内容,也没有更改任何其他hibernate规范。现在我突然发现了这个错误?

我想这和我的@Id是字符串有关吧?但在这些变化之前,这对我来说是很好的。所以我觉得奇怪的是,为什么它会突然开始困扰我,因为我没有改变任何与冬眠相关的东西。

代码语言:javascript
复制
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)

我的用户类

代码语言:javascript
复制
@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方法。

代码语言:javascript
复制
        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);

我坚持的方法在我的刀

代码语言:javascript
复制
@Override
    public void persist(Object entity) {
        session = HibernateUtil.getSessionFactory().getCurrentSession();    
        session.beginTransaction();
        session.persist(entity);
        session.getTransaction().commit();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-01 17:36:04

由于您使用的是mysql服务器,所以它不支持AUTO_INCREMENT的非主键属性,您的主键是用户名。

因此,您可以在实体类和DB架构中将主键更改为empId字段。

代码语言:javascript
复制
@Id
@GeneratedValue(strategy=GenerationType.AUTO) 
private long empId;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32893434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档