用于2个休眠会话的自定义Hibernate Id生成器

时间:2018-03-08 03:00:59

标签: java postgresql hibernate

我有双写的用例,我需要将实体保存到Oracle和Postgres DB。我还想实现一个自定义的IdentifierGenerator来创建新的主键,这些主键必须在Oracle和Postgres中保持一致。

实体如下(Getter和Setter被忽略)。

@Entity
@Table(name = "users")
@GenericGenerator(
    name = "CUSTOM_ID_GENERATOR",
    strategy = "<class reference>",
)
public class User implements Serializable {

    @Id
    @GeneratedValue( generator = "idGenerator")
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;
}

保存实体时,我要做的就是:

User user = new User();
user.setName("USER_1");
long id = oracleSession.save(user);
user.setId(id);
postgresSession.save(user);

对于我的代码,是否会导致在Postgres中生成新的ID?如果是这样,那么实现应该如何在Oracle和Postgres中保持相同的id?

当手动设置id时,有没有办法让IdGenerator NOT 生成新值?

提前致谢。

1 个答案:

答案 0 :(得分:0)

每次调用save方法时,

@GeneratedValue都会产生新值。因此,您无法保证OraclePG的值相同。 在这种情况下,您需要使用指定的Id。

您的应用程序应生成id并应设置为用户对象。然后,分配的ID将保存到DB。 为此,您必须删除@GeneratedValue注释,请参阅此documentation page

现在接下来的问题是如何为表生成唯一的Id,最简单的方法是使用来自任一DB的序列并获取新值并将其设置为用户对象。有关详细信息,请浏览this question