Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate/SQL SERVER java.SQL.SQLException:无法在具有默认值的列中插入空值_Java_Sql Server_Spring_Jpa_Spring Data Jpa - Fatal编程技术网

Hibernate/SQL SERVER java.SQL.SQLException:无法在具有默认值的列中插入空值

Hibernate/SQL SERVER java.SQL.SQLException:无法在具有默认值的列中插入空值,java,sql-server,spring,jpa,spring-data-jpa,Java,Sql Server,Spring,Jpa,Spring Data Jpa,有了Hibernate和SQL Server,当我想更新名为客户端的实体时,我面临一个问题。客户端实体具有审核字段,如创建/更新此客户端的当前用户的名称以及这些操作发生的日期时间。这里的问题是,当更新发生时,会在日志下面抛出java.sql.SQLException,以获取更多详细信息: 原因:java.sql.SQLException:无法将值NULL插入 列'IS_Supplier',表'ijs_DB.dbo.TF_CODE_PAIE';专栏是这样的 不允许空值。更新失败。在 net.sou

有了Hibernate和SQL Server,当我想更新名为客户端的实体时,我面临一个问题。客户端实体具有审核字段,如创建/更新此客户端的当前用户的名称以及这些操作发生的日期时间。这里的问题是,当更新发生时,会在日志下面抛出java.sql.SQLException,以获取更多详细信息:

原因:java.sql.SQLException:无法将值NULL插入 列'IS_Supplier',表'ijs_DB.dbo.TF_CODE_PAIE';专栏是这样的 不允许空值。更新失败。在 net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368) ~[jtds-1.2.4.jar:1.2.4]at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820) ~[jtds-1.2.4.jar:1.2.4]at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258) ~[jtds-1.2.4.jar:1.2.4]at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632) ~[jtds-1.2.4.jar:1.2.4]at net.sourceforge.jtds.jdbc.jtdstatement.processResults(jtdstatement.java:584) ~[jtds-1.2.4.jar:1.2.4]at net.sourceforge.jtds.jdbc.jtdstatement.executeSQL(jtdstatement.java:546) ~[jtds-1.2.4.jar:1.2.4]at net.sourceforge.jtds.jdbc.jtdsprearedstatement.executeUpdate(jtdsprearedstatement.java:506) ~[jtds-1.2.4.jar:1.2.4]at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3421) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3283) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3695) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:149) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at forEach(LinkedHashMap.java:684)~[?:?]at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:108) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1344) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:435) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3221) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2389) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.engine.jdbc.internal.jdbcoordinatorimpl.beforeTransactionCompletion(jdbcoordinatorimpl.java:447) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(jdbResourceLocalTransactionCoordinatorImpl.java:183) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl.access$300(jdbResourceLocalTransactionCoordinatorImpl.java:40) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.resource.transaction.backend.jdbc.internal.jdbResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(jdbResourceLocalTransactionCoordinatorImpl.java:281) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ~[hibernate-core-5.4.10.Final.jar:5.4.10.Final]at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:534) ~[spring-orm-5.2.3.RELEASE.jar:5.2.3.RELEASE]。。。98多

请注意,IS_SUPPRIMER列是用于指示此列是否被删除(IS_SUPPRIMER=true/deleted,IS_SUPPRIMER=false/not deleted)的审核字段之一,因此我们进行逻辑删除,而不是物理删除

奇怪的是,映射到TF_client表的client实体在脚本下面有一个名为is_supplier的列,该列具有默认值:

CREATE TABLE [dbo].[TF_CLIENT] (
    [CLT_ID] [bigint] IDENTITY(1,1) NOT NULL,
    [CLT_LIBELLE] [nvarchar](50) NOT NULL,
    [CLT_DT_OUVERTURE] [date] NOT NULL,
    [CLT_DT_FERMETURE] [date],
    [CLT_B_ACTIF] [bit] CONSTRAINT DF_TF_CLIENT_B_ACTIF DEFAULT 1 NOT NULL,
    [DATE_CREATION] [datetime2](3),
    [DATE_MODIFICATION] [datetime2](3),
    [DATE_SUPRESSION] [datetime2](3),
    [AUTEUR_CREATION] [nvarchar](100),
    [AUTEUR_MODIFICATION] [nvarchar](100),
    [AUTEUR_SUPRESSION] [nvarchar](100),
    [IS_SUPPRIMER] [bit] CONSTRAINT DF_TF_UTILISATEUR_IS_SUPPRIMER DEFAULT 0 NOT NULL
    CONSTRAINT UQ_CLT_LIBELLE UNIQUE(CLT_LIBELLE),
    CONSTRAINT PK_TF_CLIENT PRIMARY KEY CLUSTERED
(
[CLT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    END
那么,为什么更新这样一个客户实体需要一个已经有默认值的IS\u supplier值呢

以下为审计类代码:

@Embeddable
@Getter
@Setter
@NoArgsConstructor
public class FieldAuditing implements Serializable {

    @Column(name = "DATE_CREATION")
    private Instant createdAt;

    @Column(name = "DATE_MODIFICATION")
    private Instant updatedAt;

    @Column(name = "DATE_SUPRESSION")
    private Instant deletedAt;

    @Column(name = "AUTEUR_CREATION", length = 100)
    private String createdBy;

    @Column(name = "AUTEUR_MODIFICATION", length = 100)
    private String updatedBy;

    @Column(name = "AUTEUR_SUPRESSION", length = 100)
    private String deletedBy;

    @Column(name = "IS_SUPPRIMER")
    private Boolean isDeleted = false;

    @PrePersist
    public void prePersist() {
        if (this.isDeleted == null)
            setIsDeleted(Boolean.FALSE);
        setCreatedAt(Instant.now());
        setCreatedBy(LoggedInUser.get());
    }

    @PreUpdate
    public void preUpdate() {
        if (this.isDeleted == null)
            setIsDeleted(Boolean.FALSE);
        setUpdatedAt(Instant.now());
        setUpdatedBy(LoggedInUser.get());
    }

}
还有客户实体类:

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name="TF_CLIENT", schema="dbo")
public class Client implements Serializable {

    private static final long serialVersionUID = 8832848102370267801L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name = "CLT_ID", nullable = false)
    private Long id;

    @Column(name = "CLT_LIBELLE", nullable = false, length = 50, unique = true)
    private String libelle;

    @Temporal(TemporalType.DATE)
    @Column(name = "CLT_DT_OUVERTURE", nullable = false)
    private Date dateOuverture;

    @Temporal(TemporalType.DATE)
    @Column(name = "CLT_DT_FERMETURE")
    private Date dateFermeture;

    @Column(name = "CLT_B_ACTIF")
    private boolean isActif;

    @Embedded
    private FieldAuditing fieldAuditing = new FieldAuditing() ;

    @JsonIgnore
    @OneToMany
    @Builder.Default
    @JoinColumn(name="CLI_ID")
    Set<Etablissement> etablissements = Collections.emptySet();

    @JsonIgnore
    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name="CLI_ID")
    @Builder.Default
    @Setter(AccessLevel.NONE)
    Set<CodePaie> codePaies = new HashSet<>();

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, mappedBy = "client", orphanRemoval = true)
    @Builder.Default
    @Setter(AccessLevel.NONE)
    Set<ClientAction> clientActions = Sets.newHashSet();

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, mappedBy = "client", orphanRemoval = true)
    @Builder.Default
    @Setter(AccessLevel.NONE)
    Set<ClientEtat> clientEtats = Sets.newHashSet();

    public void addClientActions(Set<ClientAction> clientActions) {
        clientActions.forEach(clientAction -> clientAction.setClient(this));
        this.clientActions.addAll(clientActions);
    }

    public void addClientEtats(Set<ClientEtat> clientEtats) {
        clientEtats.forEach(etat -> etat.setClient(this));
        this.clientEtats.addAll(clientEtats);
    }

    public void addCodePaies(Set<CodePaie> codePaies) {
        codePaies.forEach(codePaie -> codePaie.setClient(this));
        this.codePaies.addAll(codePaies);
    }

    public void removeAllCodePaie() {
        codePaies.forEach(codePaie -> codePaie.setClient(null));
        this.codePaies.clear();
    }

}
请看一下我的问题描述并帮助我


非常感谢您的帮助。

例外情况表明问题出在TF_代码而不是TF_客户端。我猜TF_CODE_PAIE.IS_supplier没有默认值。

JPA使用表的所有字段执行查询。因此,当您不设置
isDeleted private ClientDto save(ClientDto clientDto, Client client) {
        startDateShouldBeBeforeEndDate(clientDto);
        hasUniqueCodePaies(clientDto.getCodePaies());
        Client clientSaved = clientRepository.save(clientMapper.toEntity(clientDto, client));
        clientMapper.addOrRemoveClientActions(clientDto, clientSaved);
        clientMapper.addOrRemoveClientEtats(clientDto, clientSaved);
        clientRepository.save(clientSaved);
        clientDto.setId(clientSaved.getId());
        return clientDto;
    }
@Column(name = "IS_SUPPRIMER", columnDefinition = "bit default 0")
private Boolean isDeleted;