我有双写的用例,我需要将实体保存到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 生成新值?
提前致谢。
答案 0 :(得分:0)
@GeneratedValue
都会产生新值。因此,您无法保证Oracle
和PG
的值相同。
在这种情况下,您需要使用指定的Id。
您的应用程序应生成id并应设置为用户对象。然后,分配的ID将保存到DB。
为此,您必须删除@GeneratedValue
注释,请参阅此documentation page。
现在接下来的问题是如何为表生成唯一的Id,最简单的方法是使用来自任一DB的序列并获取新值并将其设置为用户对象。有关详细信息,请浏览this question。