使用Hibernate App在Java中更改PostgreSQL的MySql时出错

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述使用Hibernate App在Java中更改PostgreSQL的MySql时出错相关的知识,希望能为你提供帮助。
我尝试将我的应用程序从mysql迁移到PostgreSQL。它只是一个非常小的应用程序,我正在努力。只有5或6个表。
所以我在postgresql中重新创建了相同的数据库,我了解到用户词是为postgress保留的,主键需要是串行类型。
经过一些小的调整后,Hibernate正在工作,我可以直接从db重新创建模型。
我遇到的第一个问题是,当我尝试存储它时,它将0添加为PK。因此在java中,当从数据库中获取该对象(PK为0)并且我正在创建一个新对象时,“null”int为0(或者说,unassign int为0),它会给我错误:

A different object with the same identifier value was already associated with the session

这就是我存储实体的方式。
public Object addOrUpdate(Object item) throws Exception { sessionFactory.getCurrentSession().saveOrUpdate(item); return item; }

在一些谷歌之后,我改变saveOrUpdatemerge,但是虽然我没有得到那个错误,所有的值替换第一个(具有PK 0)。所以我在数据库中结束了最后一个对象是存储的对象。
这是我的表:
使用Hibernate App在Java中更改PostgreSQL的MySql时出错

文章图片

id(最后一列)创建为BigSerial。
这是Hibernate从我的postgresql创建的Java模型
@Id@Column(name = "id", unique = true, nullable = false) public long getId() { return this.id; }public void setId(long id) { this.id = id; }

我正在使用Java1.8和PostgreSQL 10。
那么我如何继续使用postgresql但避免出现这些问题?
答案如果要在hibernate中支持自动增量,则需要添加其他注释。
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") private int id;

生成的值注释是自动递增值所必需的。有四种不同类型的发电策略。
1) generation type.auto
2)GenerationType.IDENTITY
3)GenerationType.SEQUENCE
4)GenerationType.TABLE
有关说明,请参阅以下链接
【使用Hibernate App在Java中更改PostgreSQL的MySql时出错】https://thoughts-on-java.org/jpa-generate-primary-keys/

    推荐阅读