org.hibernate.id.IdentifierGenerationException:此类的ID必须在调用save()之前手动分配:com.app.entites.LDetails

时间:2019-02-11 06:24:22

标签: hibernate id-generation

我尝试使用下面的代码多次在表中插入id值,但是它总是抛出org.hibernate.id.IdentifierGenerationException:此类的id必须在调用save():com.app.entites之前手动分配。 LDetails

以下是实体类中的代码

@Column(name="LID")
@GenericGenerator(name="generatedId", strategy="com.app.common.IdGenerator")
@GeneratedValue(generator="generatedId", strategy=GenerationType.SEQUENCE)
@NotNull
private String lId;

我已经使用IdentifierGenerator实现了id生成器,如下所示:

public class IdGenerator implements IdentifierGenerator{

private static String id;

@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
    Connection con = session.connection();
    try {
        Statement statement = con.createStatement();
        ResultSet rs = statement.executeQuery("select count(ID) from L_DETAILS");
        if(rs.next()) {
            int i = rs.getInt(1)+1;
            this.id="ll"+i;
            System.out.println("generated id is "+id);
            return "l"+i;
        }
    }catch(SQLException e) {
        e.printStackTrace();
    }
    return null;
}

}

2 个答案:

答案 0 :(得分:1)

您忘记在顶部添加@Id注释。您添加了@GeneratedValue批注的事实并不意味着您可以保留@Id批注。您仍然需要它。

答案 1 :(得分:0)

使用以下方法在您的实体类中自动生成主键:-

 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Entity;

        @Entity
        @Table(name = "your_table_name")
        public class YourEntityClass{

            @Id
            @GeneratedValue(strategy = GenerationType.AUTO)
            @Column(name = "id")
            private long id;

            //other column names

           // setter & getter methods

        }

此后,每当您在表中保存新记录时,都不必生成新ID