Java org.hibernate.exception.ConstraintViolationException:无法插入
当我尝试添加到Java org.hibernate.exception.ConstraintViolationException:无法插入,java,spring,hibernate,db2,Java,Spring,Hibernate,Db2,当我尝试添加到TDEPOFAZLA表中时,出现以下错误: org.springframework.dao.DataIntegrityViolationException:无法插入:[tr.gov.tcmb.pgmtems.model.DepoFazla];SQL[插入PGMTEMS.TDEPOFAZLA(ID,FAZLABULUNDURMAORANI,GRUP)值(默认值,,?)];约束[null];嵌套异常为org.hibernate.exception.ConstraintViolation
TDEPOFAZLA
表中时,出现以下错误:
org.springframework.dao.DataIntegrityViolationException:无法插入:[tr.gov.tcmb.pgmtems.model.DepoFazla];SQL[插入PGMTEMS.TDEPOFAZLA(ID,FAZLABULUNDURMAORANI,GRUP)值(默认值,,?)];约束[null];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法插入:[tr.gov.tcmb.pgmtems.model.DepoFazla]
这是我的JUnit测试函数:
@Test
public void testSaveDepoFazla() {
DepoTur depoTur = new DepoTur("my tür", 5);
depoTurService.saveDepoTur(depoTur);
List<DepoTur> list = depoTurService.getDepoTurList();
assertNotNull(list.get(0));
BigDecimal fazlaBulundurmaOrani = new BigDecimal(6000);
DepoFazla depoFazla = new DepoFazla(1, list.get(0), fazlaBulundurmaOrani);
depoFazlaService.saveDepoFazla(depoFazla);
}
这里是DepoTur.java:
@Entity
@Table(schema = "PGMTEMS", name = "TDEPOFAZLA")
public class DepoFazla implements Serializable {
private static final long serialVersionUID = -2800365387332643658L;
@Id
@GeneratedValue
@Column(name = "ID", nullable = false, updatable = false)
private Long id;
@Column(name = "GRUP", nullable = false, columnDefinition = "INTEGER")
private Integer grup;
@ManyToOne(fetch = FetchType.LAZY, targetEntity = DepoTur.class)
@JoinColumn(name = "ID", insertable = false, updatable = false)
@NotNull
private DepoTur depoTur;
@Column(name = "FAZLABULUNDURMAORANI", nullable = false, columnDefinition = "DECIMAL(6, 2)")
private BigDecimal fazlaBulundurmaOrani;
public DepoFazla() {
super();
}
public DepoFazla(Integer grup, DepoTur depoTur, BigDecimal fazlaBulundurmaOrani) {
super();
this.grup = grup;
this.depoTur = depoTur;
this.fazlaBulundurmaOrani = fazlaBulundurmaOrani;
}
//GETTER AND SETTER METHODS
}
@Entity
@Table(schema = "PGMTEMS", name = "TDEPOTUR")
public class DepoTur implements Serializable {
private static final long serialVersionUID = 6203672609079710060L;
@Id
@GeneratedValue
@Column(name = "ID", nullable = false, updatable = false)
@Index(name = "XUTDEPOTURP", columnNames = { "id" })
private Long id;
@Column(name = "ACIKLAMA", nullable = false)
private String aciklama;
@Column(name = "BLOKESIRASI", nullable = false)
private Integer blokeSirasi; //
@Column(name = "DEPOCINSI")
private String depoCinsi;
public DepoTur() {
super();
}
public DepoTur(String aciklama, Integer blokeSirasi, String depoCinsi) {
super();
this.aciklama = aciklama;
this.depoCinsi = depoCinsi;
this.blokeSirasi = blokeSirasi;
}
public DepoTur(String aciklama, Integer blokeSirasi) {
super();
this.aciklama = aciklama;
this.blokeSirasi = blokeSirasi;
}
//GETTER AND SETTER METHODS
调试JUnit测试时,出现以下错误:
错误:db2sql错误:SQLCODE=-407,SQLSTATE=23502,SQLERRMC=TBSPACEID=2,TABLEID=75,COLNO=2,DRIVER=3.50.152 SQLSTATE:23502错误代码:-407
当我搜索错误时,我发现我试图插入NULL,但我无法确定在哪里添加NULL值
这就是我创建TDEPOFAZLA表的方式:
CREATE TABLE TDEPOFAZLA
(
ID decimal(20,0) PRIMARY KEY NOT NULL,
GRUP int NOT NULL,
DEPOTUR decimal(20,0) NOT NULL,
FAZLABULUNDURMAORANI decimal(6,2) NOT NULL
);
CREATE UNIQUE INDEX XUTDEPOFAZLAP ON TDEPOFAZLA(ID);
CREATE TABLE TDEPOTUR
(
ID decimal(20,0) PRIMARY KEY NOT NULL,
ACIKLAMA varchar(100) NOT NULL,
DEPOCINSI char(1),
BLOKESIRASI int NOT NULL
);
CREATE UNIQUE INDEX XUTDEPOTURP ON TDEPOTUR(ID);
这就是我创建TDEPOTUR表的方式:
CREATE TABLE TDEPOFAZLA
(
ID decimal(20,0) PRIMARY KEY NOT NULL,
GRUP int NOT NULL,
DEPOTUR decimal(20,0) NOT NULL,
FAZLABULUNDURMAORANI decimal(6,2) NOT NULL
);
CREATE UNIQUE INDEX XUTDEPOFAZLAP ON TDEPOFAZLA(ID);
CREATE TABLE TDEPOTUR
(
ID decimal(20,0) PRIMARY KEY NOT NULL,
ACIKLAMA varchar(100) NOT NULL,
DEPOCINSI char(1),
BLOKESIRASI int NOT NULL
);
CREATE UNIQUE INDEX XUTDEPOTURP ON TDEPOTUR(ID);
有什么想法吗?在您的
DepoFazla
模型中,您似乎两次为联接列Id指定了相同的名称。您必须更改其名称使用,例如:
@Entity
@Table(schema = "PGMTEMS", name = "TDEPOFAZLA")
public class DepoFazla implements Serializable {
private static final long serialVersionUID = -2800365387332643658L;
...
@ManyToOne(fetch = FetchType.LAZY, targetEntity = DepoTur.class)
@JoinColumn(name = "ID_depoTur", insertable = false, updatable = false)
@NotNull
private DepoTur depoTur;
...
}
您对FK的属性定义是错误的,正如我看到您使用可更新、可插入到false一样,您真正想要的是FK对象不被修改,因为它可能是一些其他实体的公共主表 那么你能用的就是这个
@ManyToOne(cascade= {CascadeType.DETACH})
@JoinColumn(name = "DEPOTUR")
@NotNull
private DepoTur depoTur;
使用DETACH,您将仅在第一个表DEPOTUR列中保存值,并且不会更新DEPOTUR表中的对象
还可以在第一个表中添加FK
CREATE TABLE TDEPOFAZLA
(
ID decimal(20,0) PRIMARY KEY NOT NULL,
GRUP int NOT NULL,
DEPOTUR decimal(20,0) NOT NULL,
FAZLABULUNDURMAORANI decimal(6,2) NOT NULL
);
CREATE UNIQUE INDEX XUTDEPOFAZLAP ON TDEPOFAZLA(ID);
CONSTRAINT fk_column FOREIGN KEY (DEPOTUR) REFERENCES TDEPOTUR(ID);
问题是我没有正确引用联接列。这就解决了问题:
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "DEPOTUR", referencedColumnName = "ID", nullable = false, columnDefinition = "DECIMAL(20,0)")
@NotNull
private DepoTur depoTur;
我尝试过在数据库和代码中更改ID列名。但是,我仍然得到相同的错误。@supaplexy您能在准备对象并持久化它的地方添加一段Java代码吗?您是否为所有属性定义了getter/setter?
TDEPOFAZLA
有四个不可为空的列,而insert语句提供的值较少。表定义中没有默认的ID
,并且DEPOTUR
完全缺失。为什么要用MySQL>@cralfaro标记这个问题?我已经为所有属性定义了getter/setter,并相应地更新了问题。@supalexy你能试试我在回答中添加的内容吗?更改映射并创建FK,如果仍然失败,可能我需要您发送一段代码,在其中准备对象并做出承诺感谢您的响应。我已将我的答案添加到这个问题上。