【问题标题】:New record does not get a generated id新记录没有得到生成的 id
【发布时间】:2018-09-21 18:46:31
【问题描述】:

我创建了一个在启动时通过 FlywayDB 迁移的新表:

CREATE TABLE IF NOT EXISTS place_address (
  id bigint,
  place_id bigint NOT NULL,
  street character varying(255) NOT NULL,
  postal_code character varying(255) NOT NULL,
  city character varying(255) NOT NULL,
  country character varying(255) NOT NULL,
  address_type character varying(255) NOT NULL,

  FOREIGN KEY (place_id) REFERENCES place(id),

  CONSTRAINT place_address_pkey PRIMARY KEY (id)
);

我正在创建这样一个实体并将其存储为JpaRepository

PlaceAddressEntity placeAddressEntity = new PlaceAddressEntity();
placeAddressEntity.setPlace(placeEntity);
placeAddressEntity.setStreet(establishmentDto.getAddress().getStreet());
placeAddressEntity.setCity(establishmentDto.getAddress().getCity());
placeAddressEntity.setCountry(establishmentDto.getAddress().getCountry());
placeAddressEntity.setPostalCode(establishmentDto.getAddress().getPostalCode());
placeAddressEntity.setAddressType(AddressType.GEOGRAPHIC);

this.placeAddessRepository.save(placeAddressEntity);

但是,这就是我得到的:

2018-09-21 18:42:05.319  WARN 13842 --- [io-8443-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 23502
2018-09-21 18:42:05.319 ERROR 13842 --- [io-8443-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: null value in column "id" violates not-null constraint
  Detail: Failing row contains (null, 8, Western Road 2-20, NW10 7LW, Greater London, United Kingdom, GEOGRAPHIC).
2018-09-21 18:42:05.322  INFO 13842 --- [io-8443-exec-10] m.a.s.e.CustomRestExceptionHandler       : org.springframework.dao.DataIntegrityViolationException
2018-09-21 18:42:05.323  INFO 13842 --- [io-8443-exec-10] m.a.s.e.CustomRestExceptionHandler       : org.hibernate.exception.ConstraintViolationException

实体定义为:

@Entity
@Table(name = "place_address")
public class PlaceAddressEntity {

    public enum AddressType {
        GEOGRAPHIC,
        BILLING
    }

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

    @ManyToOne
    @JoinColumn(name = "place_id", nullable = false)
    private PlaceEntity place;

    @Column
    private String street;

    @Column(name = "postal_code")
    private String postalCode;

    @Column
    private String city;

    @Column
    private String country;

    @Column(name = "address_type")
    @Enumerated(EnumType.STRING)
    private AddressType addressType;

}

我不知道问题是什么 - 知道我缺少什么吗?


这里也是PlaceAddressRepository

public interface PlaceAddessRepository extends JpaRepository<PlaceAddressEntity, Long> {

}

【问题讨论】:

    标签: hibernate spring-boot postgresql-9.6


    【解决方案1】:

    这是因为您没有使用自动增量功能

    使用id SERIAL PRIMARY KEY,必须在表定义中设置。

    【讨论】:

    • 我不得不选择BIGSERIAL,但这基本上是我所需要的。谢谢你:)
    【解决方案2】:

    当我看到@Antoniossss 的答案时,我正要发布答案。但是,我发布我的只是为了让我们看看 SERIAL 或在我的情况下 BIGSERIAL 为我们做了什么。

    我能够使它与这个一起工作:

    CREATE SEQUENCE IF NOT EXISTS public.place_address_id_seq
      START WITH 1
      INCREMENT BY 1
      NO MINVALUE
      NO MAXVALUE
      CACHE 1;
    
    ALTER SEQUENCE public.place_address_id_seq OWNED BY public.place_address.id;
    
    ALTER TABLE ONLY public.place_address ALTER COLUMN id SET DEFAULT nextval('public.place_address_id_seq'::regclass);
    

    但是,我更喜欢这一个班轮:

    id BIGSERIAL PRIMARY KEY,
    

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      相关资源
      最近更新 更多