在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),一个新生成的值,还是我应该期待一个例外?
我希望在持久化时使用该检查来检测任何异常。
答案 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对象配置为始终替换值。