@Id @GeneratedValue但设置了自己的ID值

我有一个生成id的表,但在某些情况下我想自己设置它。 我可以以某种方式强制Hibernate忽略@GeneratedValue吗?

这可能是一种矫枉过正,但你有没有考虑编写自己的CustomIDGenerator,它可能是子类说hibernate的AutoGenerator并公开了几种方法,你可以设置下一个类对象的id来生成,例如

 class MyGenerator extends .... { public void setIdForObject(Class clazz, Long id) { //once you use this API, the next time an object of //type clazz is saved the id is used } public void setIdForObject(Class clazz, Long id, Matcher matcher) { //once you use this API, the next time an object of //type clazz is saved and the matcher matches yes the id will be //assigned. Your matcher can match properties like name, age etc //to say the matched object } } 

这可能会变得复杂,但至少可以按照hibernate doco进行

虽然很久以前就提出过这个问题,但我在@lOranger的这篇文章中找到了完美的答案,并想分享它。

此提议检查对象的当前id是否设置为null以外的null ,如果是,则使用它,否则,它使用默认(或配置)生成策略生成它。

这很简单,直截了当,解决了@Jens带来的问题,一个无法检索对象当前id的问题。

我刚刚实现了它(通过扩展UUIDGenerator),它就像一个魅力:-D

对于您的用例,您可以手动添加此用户。 一种方法是将insert操作放在名为“./import.sql”的文件中(在类路径中)。 当SessionFactory启动时,Hibernate将执行这些语句。

创建自己的识别者/序列生成器

 public class FilterIdentifierGenerator extends IdentityGenerator implements IdentifierGenerator{ @Override public Serializable generate(SessionImplementor session, Object object) throws HibernateException { // TODO Auto-generated method stub Serializable id = session.getEntityPersister(null, object) .getClassMetadata().getIdentifier(object, session); return id != null ? id : super.generate(session, object); } } 

将您的实体修改为:

 @Id @GeneratedValue(generator="myGenerator") @GenericGenerator(name="myGenerator", strategy="package.FilterIdentifierGenerator") @Column(unique=true, nullable=false) private int id; ... 

保存而不是使用persist()使用merge()update()