PostgreSQL не выполняет автоинкрементирование

#java #postgresql #spring-boot

#java #postgresql #весенняя загрузка

Вопрос:

Я использую postgresql с springboot. Поэтому всякий раз, когда я использую метод post для добавления новой детали в мою таблицу вместо идентификатора автоинкрементирования, он меняется с 1 на 3. Он принимает альтернативные значения, а не последовательные значения. Я задал следующие свойства, а затем создал таблицу: spring.jpa.hibernate.ddl-auto=create Не создавал таблицу вручную. В чем причина этой ошибки? Это мой класс сущности.

 @Entity
@Table(name = "NORTHBOUND_SUBSCRIPTION")
public class NBSubscription {

@Id
@GeneratedValue
@Column(name = "nb_id")
private Long nbId;

@Column(name = "DEVICE_FILTER")
private String deviceFilter;

@Column(name = "INTERFACE_FILTER")
private String interfaceFilter;

@ManyToOne  
@JoinColumn(name="subscriber_id", referencedColumnName="SUBSCRIBER_ID")
private Subscriber subscriber;

@OneToOne
@JoinColumn(name="sensor_group_id", referencedColumnName="ID")
private SensorGroup sensorGroup;

@Column(name = "EVENT_TYPE")
private String eventType;

@Column(name = "SAMPLING_INTERVAL")
private Integer samplingInterval;

@Column(name = "CREATEAT")
@DateTimeFormat(pattern = "dd-MM-yyyy HH:mm")
private Timestamp createAt;

@Column(name = "MODIFIEDAT")
@DateTimeFormat(pattern = "dd-MM-yyyy HH:mm")
private Timestamp modifiedAt;

@Column(name = "CREATEDBY")
private String createdBy;

@Column(name = "MODIFIEDBY")
private String modifiedBy;

@Column(name = "mark_deletion")
private String markDeletion;


public NBSubscription() {
    super();
}
    
public NBSubscription(Subscriber subscriber, SensorGroup sensorGroup) {
    super();        
    this.subscriber = subscriber;
    this.sensorGroup = sensorGroup;
}



public Long getNbId() {
    return nbId;
}

public void setNbId(Long nbId) {
    this.nbId = nbId;
}

public String getDeviceFilter() {
    return deviceFilter;
}
public void setDeviceFilter(String deviceFilter) {
    this.deviceFilter = deviceFilter;
}
public String getInterfaceFilter() {
    return interfaceFilter;
}
public void setInterfaceFilter(String interfaceFilter) {
    this.interfaceFilter = interfaceFilter;
}

@JsonIgnore
public Subscriber getSubscriber() {
    return subscriber;
}
public void setSubscriber(Subscriber subscriber) {
    this.subscriber = subscriber;
}
public SensorGroup getSensorGroup() {
    return sensorGroup;
}
public void setSensorGroup(SensorGroup sensorGroup) {
    this.sensorGroup = sensorGroup;
}
public Integer getSamplingInterval() {
    return samplingInterval;
}
public void setSamplingInterval(Integer samplingInterval) {
    this.samplingInterval = samplingInterval;
}

public String getEventType() {
    return eventType;
}

public void setEventType(String eventType) {
    this.eventType = eventType;
}


    public Timestamp getCreateAt() {
    return createAt;
}

public void setCreateAt(Timestamp createAt) {
    this.createAt = createAt;
}

public Timestamp getModifiedAt() {
    return modifiedAt;
}

public void setModifiedAt(Timestamp modifiedAt) {
    this.modifiedAt = modifiedAt;
}

public String getMarkDeletion() {
    return markDeletion;
}

public void setMarkDeletion(String markDeletion) {
    this.markDeletion = markDeletion;
}

public String getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(String createdBy) {
    this.createdBy = createdBy;
}

public String getModifiedBy() {
    return modifiedBy;
}

public void setModifiedBy(String modifiedBy) {
    this.modifiedBy = modifiedBy;
}
 

Комментарии:

1. Мы не можем помочь, потому что вы не предоставили соответствующий код, как вы настраиваете автоинкремент, например. на уровне сущности с помощью аннотаций. С какими вопросами, документацией, блогами, учебными пособиями, книгами вы консультировались?

2. Таким образом, он выполняет автоинкремент. Это просто не увеличивается так, как вы предполагали. Вы вызываете ошибку, которая работает просто отлично.

3. Я хочу, чтобы идентификатор увеличивался как 1,2,3,4,5, …. но он увеличивается как 1,3,5,7 … есть ли какой-нибудь способ, чтобы я мог увеличивать его последовательно?

4. если все объекты используют одну и ту же последовательность для автоинкрементов, ваши идентификаторы будут распределены по объектам, может ли это быть тем, что происходит?

5. Это может быть возможно, потому что в какой-то таблице я получаю последовательность как 1,3,5,7, а в другой таблице последовательность равна 2,4,6,8. Если это причина, не могли бы вы сообщить мне, что мне делать?

Ответ №1:

Попробуйте это

 @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
 

если это не сработает, попробуйте использовать последовательность таблиц

 @Id
@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
   
 

Ответ №2:

Ваш автоинкремент реализован с помощью последовательности, и по умолчанию объекты используют одну и ту же последовательность, поэтому значения автоинкремента распределяются по объектам.

Вы можете назначить каждому объекту свою собственную последовательность. Но имейте в виду, что последовательности не участвуют в транзакциях. Это означает, что если у вас есть откат, в нумерации будет разрыв. Случайных пробелов избежать невозможно.

Если вы делаете эту последовательность видимой для пользователей, и они ожидают, что нумерация будет непрерывной, мой совет — не использовать для этого последовательность и сохранить видимый пользователем счетчик в поле отдельно от идентификатора. Если он виден пользователям, то в какой-то момент его нужно будет изменить, и вы не сможете изменить идентификаторы.

Комментарии:

1. спасибо, Натан, но это сработало с использованием generationtype.identity