【问题标题】:How to solve problem with common auto_increment id for all tables如何解决所有表的通用 auto_increment id 问题
【发布时间】:2022-01-17 13:56:47
【问题描述】:

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

我的用户:

@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;
}

我将不胜感激。

【问题讨论】:

    标签: java spring postgresql hibernate spring-data-jpa


    【解决方案1】:

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

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


    为了减少设置工作(以及出现 ID 间隙的可能性),您还可以切换到 IDENTITY,它在内部也会为表格创建和使用专用序列。但是,实体 ID 仅在插入时分配,因此可能存在性能缺陷(因为休眠不能延迟插入,例如直到事务结束)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2015-02-02
      • 2021-12-09
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多