英文:
How to generate ID only if it's null on persisting
问题
我有两个不同的组件,它们使用两个不同的数据库,但实体在两个数据库中都存在,我希望它们始终具有相同的ID。
因此,基本上当ID为空时,我希望它被自动生成;如果不为空,则使用该ID。
我正在使用Hibernate。
@Id
@Column(name = COLUMN_ID, unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
有什么建议吗?
英文:
I have two different components that use two different DB's but the entity is on both DB's and I want it to have the same ID's always.
So basically when the ID is null I want it to be auto generated, if it's not null use the ID.
I'm using hibernate.
@Id
@Column(name = COLUMN_ID, unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
Any suggestions?
答案1
得分: 6
您需要一个自定义序列生成器:
public class SetableSequenceGenerator extends SequenceStyleGenerator {
/**
* 自定义ID生成。如果在com.curecomp.common.hibernate.api.Entity实例上设置了ID,
* 则使用设置的ID,如果ID为'null'或'0',则生成一个新的ID。
*/
@Override
public Serializable generate(SharedSessionContractImplementor session, Object obj) {
if ((obj != null) && (obj instanceof Entity)) {
Entity<? extends Serializable> entity = (Entity<? extends Serializable>) obj;
if ((entity.getId() == null) || (entity.getId().equals(0))) {
return super.generate(session, obj);
}
return entity.getId();
}
return super.generate(session, obj);
}
}
作为策略,您需要指定序列生成器类的全限定名。
英文:
You need a custom sequence generator for this:
public class SetableSequenceGenerator extends SequenceStyleGenerator {
/**
* Custom id generation. If id is set on the
* com.curecomp.common.hibernate.api.Entity instance then use the set one,
* if id is 'null' or '0' then generate one.
*/
@Override
public Serializable generate(SharedSessionContractImplementor session, Object obj) {
if ((obj != null) && (obj instanceof Entity)) {
Entity<? extends Serializable> entity = (Entity<? extends Serializable>) obj;
if ((entity.getId() == null) || (entity.getId().equals(0))) {
return super.generate(session, obj);
}
return entity.getId();
}
return super.generate(session, obj);
}
}
As strategy, you specify the FQN of the sequence generator class
答案2
得分: -1
@GeneratedValue(strategy = GenerationType.IDENTITY)
在持久化过程中,您可以使用entitymanager.merge(),它将执行您想要的相同功能。
希望这能起作用!
英文:
@GeneratedValue(strategy = GenerationType.IDENTITY)
while persisting you can use entitymanager.merge() which will do the same functionality which you want.
Hope this will work!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论