当前位置: 首页 > 知识库问答 >
问题:

如何解决所有表的公共auto_incrementid问题

裴华荣
2023-03-14

我有很多表,但它们有共同的自动增量。例如,我创建了我的第一个用户,它的id为1,然后我创建了一条消息,它的id为2,然后我创建了一条对消息的注释,它的id为3,但它的id应该为1,因为我没有任何其他注释或消息

我的用户:

@Entity
@Getter
@Setter
@NoArgsConstructor

@AllArgsConstructor
@Table(name = "usr")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

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

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

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "role")
    private Role role;

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

    @Column(name = "status")
    private Status status;

//    @OneToMany(mappedBy = "author")
//    private List<Message> messages;

//    @OneToMany(mappedBy = "author")
//    private List<Comment> comments;

    @OneToOne
    @JoinColumn(name = "gender_id")
    private Gender gender;

    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address;

    @ManyToMany
    @JoinTable(
            name = "user_subscriptions",
            joinColumns =  @JoinColumn(name = "channel_id") ,
            inverseJoinColumns =  @JoinColumn(name = "subscriber_id"))
    private Set<User> subscribers;

    @ManyToMany
    @JoinTable(
            name = "user_subscriptions",
            joinColumns =  @JoinColumn(name = "subscriber_id") ,
            inverseJoinColumns =  @JoinColumn(name = "channel_id"))
    private Set<User> subscriptions;

    @OneToOne
    @JoinColumn(name = "file_id")
    private FileEntity fileEntity;

}

我的信息:

@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "message")
public class Message {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

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

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

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User author;

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

    @Column(name = "like_count")
    private Integer likeCount = 0;

    @ManyToMany
    @JoinTable(
            name = "message_likes",
            joinColumns = { @JoinColumn(name = "message_id") },
            inverseJoinColumns = { @JoinColumn(name = "user_id")}
    )
    private Set<User> likes;

    @OneToOne
    @JoinColumn(name = "file_id")
    private FileEntity fileEntity;


}

我的评论是:

@Data
@Entity
@Table(name = "comment")
public class Comment {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

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

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

    @Column(name = "like_count")
    private Integer likeCount = 0;

    @ManyToOne()
    @JoinColumn(name = "user_id")
    private User author;

    @ManyToOne()
    @JoinColumn(name = "message_id")
    private Message message;

    @ManyToMany
    @JoinTable(
            name = "comment_likes",
            joinColumns = { @JoinColumn(name = "comment_id") },
            inverseJoinColumns = { @JoinColumn(name = "user_id")}
    )
    private Set<User> likes;
}

我将感谢任何帮助。

共有1个答案

祝允晨
2023-03-14

hibernate的AUTO生成策略是SEQUENCE,它为所有实体创建并使用一个公共数据库序列。

要获得所需的行为,可以为每个表指定专用序列,例如,如下所述:https://stackoverflow.com/a/4561233
请注意,出于性能原因,hibernate可能会配置为一次保留多个ID,因此即使每个实体都有一个专用的序列,ID中也可能存在漏洞。

为了减少安装工作量(以及存在ID间隙的可能性),您还可以切换到IDENTITY,它在内部也为表创建并使用专用序列。然而,实体ID只有在插入时才被分配,因此可能存在性能缺陷(因为hibernate不能延迟插入,例如直到事务结束)。

https://thorben-janssen.com/jpa-generate-primary-keys/

 类似资料:
  • 10.10. 公共问题的解决方案 10.10.1. 对一个特定的 DataSource 使用错误的事务管理器 开发者需要按照需求仔细地选择正确的 PlatformTransactionManager 实现。理解Spring的事务抽象如何与JTA全局事务一起工作是非常重要的。使用得当,就不会有任何冲突:Spring仅仅提供一个直观的、可移植的抽象层。 如果你使用全局事务,你 必须 为你的所有事务操作

  • 当我尝试运行应用程序时,它工作正常。但是当我构建签名apk时,出现了错误 失败:构建失败,出现异常。 问题:任务“:app:lintVitalRelease”的执行失败 无法解析配置“:image_picker_android:调试单元测试运行时类路径”的所有项目。无法转换 bcprov-jdk15on-1.68.jar (org.bouncycastle:bcprov-jdk15on:1.68)

  • 问题内容: 我想有一个header.html,它定义我所有网页的标题如何。如何将此header.html插入顶部的其他网页? 可能会有更好的方法来实现要共享的公共标头。由于我仍然认为自己是html的新手(但不适合编程),因此我愿意接受更好的建议。 谢谢。 编辑:有用的答复提到了使用PHP。但是,我使用AngularJS作为前端,而我的PHP后端仅仅是一个纯REST服务器。我更喜欢用AngularJ

  • 目前,我正在学习Spring启动课程。然而,从昨天开始,当我通过VS代码启动我的主类时,我就面临这个问题:“com.training.training.Service.ProduitServiceImpl中的字段pr需要一个无法找到的“com.training.training.Repos.ProduitRepository”类型的bean。”所以我请求一些帮助来解决这个问题。 以下是stackt

  • 问题内容: 出于研究目的,我想列出npm上 所有 可用的软件包。我怎样才能做到这一点? https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#get- all上的 一些旧文档都提到了一个曾经工作过的端点,但是http://registry.npmjs.org/ -/ 现在全部返回。 问题答案: http://blog.np