如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

Posted

技术标签:

【中文标题】如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段【英文标题】:how to implement auto increment id field per table with Hibernate and postgresql for one to many relationships 【发布时间】:2013-06-05 21:53:02 【问题描述】:

我有 4 个实体一对多消息实体:

@Entity
@Table(name = "Messages")
public class Message 
...
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messagesounds_id")
    private Sound sound;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messagevibrations_id")
    private Vibration vibration;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messagecolors_id")
    private Color color;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "messageplatforms_id")
    private Platform platform;
...

而其他 4 个实体如下所示:

@Entity
@Table( name = "MessageSounds"  , uniqueConstraints=@UniqueConstraint(columnNames = "name"))
public class Sound 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="messagesounds_id")
    private Set<Message> message;
...

我可以成功创建引用了 4 个引用表的第一条记录的第一条消息记录。但是 postgresql db 中的消息表是这样的:

 id |...| messagesounds_id | messagevibrations_id | messagecolors_id | messageplatforms_id |
 1  |...| 2 | 3 | 4 | 5 |

我想让4个引用表的每个主键都自动递增,这样消息表的第一条记录应该是这样的:

 id |...| messagesounds_id | messagevibrations_id | messagecolors_id | messageplatforms_id |
 1  |...| 1 | 1 | 1 | 1 |

如何使用注解来实现这一点?

【问题讨论】:

这里是答案***.com/questions/2011528/hibernate-auto-increment-id。 我已经在所有 4 个引用实体的主键中尝试过,但它保持不变。我在想是否与休眠序列或postgresql的限制有关 这个问题怎么样:***.com/q/3433724/330315 或者这个:***.com/q/684836/330315 或者这个:***.com/a/4502062/330315 【参考方案1】:

好的,来自Hibernate use of PostgreSQL sequence does not affect sequence table a_horse_with_no_nameless 引用,

我设法为每个引用的表设置了自动递增的主键,如下所示:

@Id
@SequenceGenerator(name="pk_sequence",sequenceName="messagesounds_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
private int id;

非常感谢所有的研究。

【讨论】:

【参考方案2】:

@Id @GeneratedValue(策略=GenerationType.AUTO) 私人 int id; 并且在坚持时将其保留为空(0)。 (如果您使用 Integer / Long 包装器,则为 null)

在某些情况下,AUTO 策略被重新设置为 SEQUENCE 而不是 IDENTITY 或 TABLE,因此您可能需要手动将其设置为 IDENTITY 或 TABLE(取决于底层数据库)。

似乎 SEQUENCE + 指定序列名称对你有用。

【讨论】:

我已经尝试过了,我正在使用 postgresql。请不要在没有引用来源的情况下复制其他答案。

以上是关于如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Springboot 和 Hibernate 在 DTO 和 Aggentity 类中映射 Postgres JSON 数据类型

如何在 postgres 中设置锁定超时 - Hibernate

Hibernate - 在 postgres 中带有触发器的 saveAndFlush

最新的 Postgres JDBC41 不能与 HikariCP 和 Hibernate 一起使用:isValid() 未实现

有没有办法将 Postgres 的 UUID 生成与 Hibernate 的 IDENTITY ID 生成策略一起使用?

无法使用 Hibernate 访问 Postgres 数据库