java - 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 字段作为主键的表进行了一些测试,它可以工作,但我无法更改表。
谢谢
解决方案
推荐阅读
- sql - ROW_NUMBER(), PARTITION_BY, TOP 2 MAX If MAX 第一个和最后一个位置
- c# - 解析 401 错误描述以确定发生了哪个错误
- arrays - Powershell - 创建一个非常大的哈希表数组的最快方法
- java - 记录文本文件中出现的字母数?
- python - 多个组合框
- qt - 无法通过双击另一个应用程序来关闭通过 dbus 打开的 QMenu
- spring - 在单一上下文 Spring 应用程序中避免多实例单例
- localization - CN1 - 激活 css 后无法使用本地化
- python - 为什么人脸聚类算法不使用距离矩阵而不是聚类算法?
- javascript - 如何使用 select2 和 laravelcollective 填充视图 laravel 刀片中的其他字段