首页 > 解决方案 > SpringBoot休眠无法插入数据

问题描述

我使用 Spring-boot 创建了一个简单的休息服务器,并尝试将数据保存到数据库中,但出现此错误:

Cannot insert explicit value for identity column in table 'plu' when IDENTITY_INSERT is set to OFF

数据库是SqlServer express 2014,表如下:

CREATE TABLE [dbo].[plu](
    [REP] [int] NOT NULL,
    [PLU] [int] NOT NULL,
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [WALO] [int] NOT NULL,
    
 CONSTRAINT [PK_PLU] PRIMARY KEY CLUSTERED 
(
    [REP] ASC,
    [PLU] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON 

此表有一个复合主键,其中包含字段 (REP,PLU) 和字段 (ID) 标识。

java模型Plu如下

@Entity
@Table(name = "plu")
public class Plu {

    @EmbeddedId
    private PluId pluId;

    
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Column(name = "WALO")
    private Integer walo;

    public PluId getPluId() {
        return pluId;
    }

    public void setPluId(PluId pluId) {
        this.pluId = pluId;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getWalo() {
        return walo;
    }

    public void setWalo(Integer walo) {
        this.walo = walo;
    }
    
    public Plu() {
        
    }

    public Plu(PluId pluId, Integer walo) {
        super();
        this.pluId = pluId;
        this.walo = walo;
    }

    @Override
    public String toString() {
        return "Plu [pluId=" + pluId + ", id=" + id + ", walo=" + walo + "]";
    }

java模型PluId是

@Embeddable
public class PluId implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "REP")
    private Integer rep;

    @Column(name = "PLU")
    private Integer plu;

    public PluId() {

    }

    public PluId(Integer rep, Integer plu) {
        super();
        this.rep = rep;
        this.plu = plu;
    }

    public Integer getRep() {
        return rep;
    }

    public void setRep(Integer rep) {
        this.rep = rep;
    }

    public Integer getPlu() {
        return plu;
    }

    public void setPlu(Integer plu) {
        this.plu = plu;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((plu == null) ? 0 : plu.hashCode());
        result = prime * result + ((rep == null) ? 0 : rep.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PluId other = (PluId) obj;
        if (plu == null) {
            if (other.plu != null)
                return false;
        } else if (!plu.equals(other.plu))
            return false;
        if (rep == null) {
            if (other.rep != null)
                return false;
        } else if (!rep.equals(other.rep))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "PluId [rep=" + rep + ", plu=" + plu + "]";
    }


}

存储库接口是

public interface PluRepository extends JpaRepository<Plu, PluId> {
     
}

控制器是

@CrossOrigin
@RestController
@RequestMapping("/api")
public class PluController {

  @Autowired
  PluRepository pluRepository;

  
  @GetMapping("/plu")
  public ResponseEntity<List<Plu>> getAllPlu() {
    try {
      List<Plu> plus = new ArrayList<Plu>();

      pluRepository.findAll().forEach(plus::add);
     
      if (plus.isEmpty()) {
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
      }

      return new ResponseEntity<>(plus, HttpStatus.OK);
    } catch (Exception e) {
      return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

  

  @PostMapping("/plu")
  public ResponseEntity<Plu> createPlu(@RequestBody Plu plu) {
      try {
          Plu tmp = new Plu(plu.getPluId(),plu.getWalo());
          
          Plu _plu = pluRepository
                  .save(tmp);
         
          System.out.println(_plu.toString());
          return new ResponseEntity<>(_plu, HttpStatus.CREATED);
      } catch (Exception e) {
          return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
      }
  }

  

}

应用程序属性文件是:

spring.datasource.url=jdbc:sqlserver://192.168.99.100\\saib;databaseName=Saib

spring.datasource.username=****
spring.datasource.password=****

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=individually

server.port=8080


当我发送获取请求时应用程序工作,响应包含正确的数据。当我尝试使用以下正文发送发布请求时:

{
        "pluId": {
            "rep": 3,
            "plu": 4
        },
       
        "walo": 3
}

我有以下错误:

Cannot insert explicit value for identity column in table 'plu' when IDENTITY_INSERT is set to OFF

我还对以 ID 字段作为主键的表进行了一些测试,它可以工作,但我无法更改表。

谢谢

标签: javasql-serverspring-boothibernatejpa

解决方案


推荐阅读