如何使用 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 生成策略一起使用?