必须手动分配此类的ID?

时间:2015-10-01 17:30:13

标签: java hibernate

我最近在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);

1 个答案:

答案 0 :(得分:1)

由于您使用的是mysql服务器,因此非主键属性不支持 AUTO_INCREMENT ,而您的主键是用户名

因此您可以将主键更改为Entity类和DB模式中的 empId 字段。

@Id
@GeneratedValue(strategy=GenerationType.AUTO) 
private long empId;