2016-07-15 2 views
-1

Когда я пытаюсь добавить в TDEPOFAZLA таблицу, я получаю следующее сообщение об ошибке:org.hibernate.exception.ConstraintViolationException: не удалось вставить

org.springframework.dao.DataIntegrityViolationException: could not insert: [tr.gov.tcmb.pgmtems.model.DepoFazla]; SQL [insert into PGMTEMS.TDEPOFAZLA (ID, FAZLABULUNDURMAORANI, GRUP) values (default, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [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); 
} 

Вот мой DepoFazla.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 
} 

Вот DepoTur.java:

@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, я получаю эту ошибку:

Error: DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=2, TABLEID=75, COLNO=2, DRIVER=3.50.152 SQLState: 23502 ErrorCode: -407

Когда я ищу ошибку, я считаю, что я пытаюсь вставить 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); 

Это, как я создаю TDEPOTUR стол:

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); 

Любые идеи о том, что я должен делать?

+0

Вы определили геттеры/сеттеры для всех атрибутов? – cralfaro

+0

'TDEPOFAZLA' имеет четыре столбца с нулевым значением, в то время как оператор insert содержит меньше значений. В определении таблицы нет значения по умолчанию для 'ID', а' DEPOTUR' вообще отсутствует. И почему вы отметили это с помощью MySQL> – mustaccio

+0

@cralfaro. Я определил геттеры/сеттеры для всех атрибутов и обновил вопрос соответственно. – supaplexy

ответ

0

Проблема была в том, что я не ссылался на колонку соединения должным образом. Это решило проблему:

@ManyToOne(fetch = FetchType.LAZY, optional = false) 
@JoinColumn(name = "DEPOTUR", referencedColumnName = "ID", nullable = false, columnDefinition = "DECIMAL(20,0)") 
@NotNull 
private DepoTur depoTur; 
0

Оказывается, что вы указали такое же имя для столбца присоединиться Id дважды в модели DepoFazla вы должны изменить свое использование названия, например:

@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; 

    ... 

} 
+0

Я попытался изменить имена столбцов ID в базе данных и в коде. Тем не менее, я по-прежнему получаю ту же ошибку. – supaplexy

+0

@supaplexy вы могли бы добавить кусок кода Java, где подготовить объект и сохранить его? – cralfaro

0

Ваше определение свойства с 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); 
+0

@supalexy вы можете попробовать, что я добавил в свой ответ? Измените отображение и создайте FK, если все еще не удается, может быть, мне нужно, чтобы вы отправили фрагмент кода, где будете готовить объект, и совершите фиксацию. – cralfaro

+0

Благодарим за отзыв. Я добавил свое решение к вопросу. – supaplexy

Смежные вопросы