关于id的JPA @GeneratedValue

时间:2010-01-11 19:20:11

标签: jpa

在JPA中,我使用的是@GeneratedValue:

@TableGenerator(name = "idGenerator", table = "generator", pkColumnName = "Indecator" , valueColumnName = "value", pkColumnValue = "man")
@Entity
@Table(name="Man")
public class Man implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "idGenerator")
    @Column(name="ID")
    private long id;

    public void setId(Long i) {
        this.id=i;
    }

    public Long getId(){
        return id;
    }
}

我最初将ID设置为某个任意值(稍后用作测试条件):

public class Sear {
    public static void main(String[] args) throws Exception {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("testID");
        EntityManager em = emf.createEntityManager();
        Man man = new Man();
        man.setId(-1L);
        try {
            em.getTransaction().begin();
            em.persist(man);
            em.getTransaction().commit();
        } catch (Exception e) { }
            if(man.getId() == -1);  
        }
    }
}

执行commit()后man.id的期望值是多少?应该是(-1),一个新生成的值,还是我应该期待一个例外?

我希望在持久化时使用该检查来检测任何异常。

3 个答案:

答案 0 :(得分:4)

  

执行commit()后man.id的期望值是多少?应该是(-1),一个新生成的值,还是我应该期待一个例外?

在使用id时,您只是应该设置GeneratedValue。持久化的行为因实现而异,因此依赖此行为是一个坏主意(非便携式)。

  

我希望在持久化时使用该检查来检测任何异常。

如果出现问题,JPA将抛出({3}}的子类。处理问题的正确方法是捕获此异常(顺便说一下,这是一个RuntimeExeption

如果你坚持让穷人检查,请不要指定id并检查你是否仍然拥有默认值(在你的情况下,它会是{{} 1}})。

答案 1 :(得分:1)

您设置自动生成的字段的值是无关紧要的。它将(应该)由JPA实现根据指定的策略设置。

答案 2 :(得分:0)

在EclipseLink中,可以使用IdValidation枚举和@PrimaryKey批注或“eclipselink.id-validation”持久性单元属性进行配置。

默认情况下,null和0将导致重新生成id,但将使用其他值。如果将IdValidation设置为NEGATIVE,则也会替换负数。

您还可以将Sequence对象配置为始终替换值。