如何在持久化时仅在ID为空时生成ID。

huangapple go评论65阅读模式
英文:

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 &#39;null&#39; or &#39;0&#39; then generate one.
     */
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object obj) {
        if ((obj != null) &amp;&amp; (obj instanceof Entity)) {
            Entity&lt;? extends Serializable&gt; entity = (Entity&lt;? extends Serializable&gt;) 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!

huangapple
  • 本文由 发表于 2020年10月7日 15:13:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/64239037.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定