Java 所有实体的主键都会递增

Java 所有实体的主键都会递增,java,jpa,Java,Jpa,我正在编写简单的SE应用程序,其中包含两个实体上的CRUD操作。我注意到两个实体的主键都是自动递增的。当我持久化FirstEntity的新对象时,它得到ID=1,这很好,但是,然后我持久化SecondEntity,它的ID是2,但是应该是一,因为没有类型为SecondEntity的其他实体。发生这种情况的原因是什么 第一实体: @Entity @NamedQueries( value = { @NamedQuery( name = "Employee.findAll", query = "SEL

我正在编写简单的SE应用程序,其中包含两个实体上的CRUD操作。我注意到两个实体的主键都是自动递增的。当我持久化
FirstEntity
的新对象时,它得到ID=1,这很好,但是,然后我持久化
SecondEntity
,它的ID是2,但是应该是一,因为没有类型为
SecondEntity
的其他实体。发生这种情况的原因是什么

第一实体:

@Entity
@NamedQueries( value = {
@NamedQuery( name = "Employee.findAll", query = "SELECT e FROM Employee e")
})
public class Employee extends AbstractModel<Long, Employee>{

@Id
@GeneratedValue( strategy = GenerationType.AUTO )
private Long id;

@Basic
@Column( name = "FIRST_NAME" )
private String firstName;
@Basic
@Column( name = "LAST_NAME" )
private String lastName;
@Basic
@Column( name = "ACCOUNT_NUMBER" )
private String accountNumber;
@Column( name = "BIRTH_DATE" )
@Temporal(TemporalType.DATE)
private Date birthDate;

@ManyToMany(cascade = CascadeType.REMOVE)
@JoinTable( name = "EMP_TASK", joinColumns = {@JoinColumn( name = "EMP_ID", referencedColumnName = "ID")},
        inverseJoinColumns = {@JoinColumn( name = "TASK_ID", referencedColumnName = "ID")})
private Set<Task> tasks = new HashSet<>();
}

其中
EmployeeDAO.create(Employee)
使用
EntityManager
持久化对象

您应该在id列上使用
strategy=GenerationType.IDENTITY
。(使用表格的自动增量)

strategy=GenerationType.AUTO
将使hibernate(或您正在使用的任何JPA实现)从其自己的自动增量集合中拾取一个数字,该集合在所有可用表中共享

有关所有选项,请参见此处:

因评论而更新:

您可以尝试使用
GenerationType.Sequence

@Id
@SequenceGenerator(name="sequence1", allocationSize=1, initialValue=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sequence1")
private long id;

您能提供一些源代码吗?请提供
hbm.xml
注释类
抱歉打扰您。我经历了一次停电,我一直认为GenerationType.AUTO将作为GenerationType.IDENTITY工作。然而,我使用的是随NetBeans提供的ApacheDerby,它看起来像是自动作为表工作的。此外,IDENTITY不适用于Derby,因为
SQLIntegrityConstraintViolationException
被抛出。显然,apachederby确实提供了“始终作为IDENTITY生成”,当用户将IDENTITY放入其中时,JPA提供者应该完全能够提供这一点。也许您的JPA提供程序有一个限制不幸的是,ApacheDerby没有提供
GenerationType.IDENTITY
,而且由于类的原因,我们必须处理它purpose@Nav您可以尝试使用
GenerationType.Sequence
。见我的帖子更新。祝福你。这非常有帮助,ApacheDerby接受了它;)
public abstract class AbstractModel<ID extends Serializable, T extends AbstractModel<ID, T>> implements Serializable {

private Class<T> modelClass;

abstract public ID getId();

/**
 * Default construcot initializing class field.
 */
public AbstractModel(){
    modelClass = resolveModelClass();
}

/**
 * Default {2code equals(Object obj)| function for all entities
 * @param obj
 *      object to be compared
 * @return 
 *      true if object are eqaul, false otherwise
 */
@Override
public boolean equals(Object obj){
    if(!modelClass.isInstance(obj))
        return false;

    T other = modelClass.cast(obj);
    if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.getId().equals(other.getId()))) {
        return false;
    }

    return true;
}

@Override
public int hashCode(){
    return (getId() != null ? getId().hashCode() : 0);
}

@Override
public String toString(){
    return modelClass.getName() + "[ id=" + getId() + " ]";
}

private Class<T> resolveModelClass(){
    return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
private static void addNewEmployee() {
    Employee emp = new Employee();
    // setting fields of emp

    EmployeeDAO empDAO = new EmployeeDAOImpl();
    emp = empDAO.create(emp);
    if (emp != null) {
        System.out.println("New employee with ID: " + emp.getId() + " has been saved");
    } else {
        System.out.println("A problem occured while trying to persist employee entity");
    }
}
@Id
@SequenceGenerator(name="sequence1", allocationSize=1, initialValue=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sequence1")
private long id;