繁体   English   中英

添加新的@Lob字段后,JPA实体未保存在数据库中

[英]JPA Entity did not save in database after added new @Lob field

我有一个与未保存在数据库中的JPA实体相关的问题,因此在jpa实体中添加了新的clob字段之后-实体未保存在数据库中,我使用的是Websphere,Spring 4.3.13和Oracle11g

我的JPA Enity之前

import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.Audited;

import javax.persistence.*;
import java.sql.Timestamp;

@Entity
@Audited
@Table(name = "UserRecord")
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
@Getter
@Setter
@Access(AccessType.FIELD)
public class UserRecord {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "PR_KEY")
    private String prKey;

    //Business Key
    @Column(name = "businessId", length = 100, unique = false)
    private String businessId;

    //Business Key
    @Column(name = "name", length = 100, nullable = false)
    private String name;

    //Business Key
    @Column(name = "surname", length = 100, nullable = false)
    private String surname;

    @Column(name = "updateDateTime", length = 50, nullable = false)
    private Timestamp updateDateTime;

    @Version
    private int version;

    @Column(name = "user", length = 100000)
    @Lob
    private byte[] user;


    public UserRecord(String businessId, String name, String surname, Timestamp updateDateTime, byte[] user) {
        this.businessId = businessId;
        this.name = name;
        this.surname = surname;
        this.updateDateTime = updateDateTime;
        this.user = user;
    }
}

之后

import lombok.*;
    import org.hibernate.annotations.GenericGenerator;
    import org.hibernate.envers.Audited;

    import javax.persistence.*;
    import java.sql.Timestamp;

    @Entity
    @Audited
    @Table(name = "UserRecord")
    @NoArgsConstructor(access = AccessLevel.PUBLIC)
    @AllArgsConstructor
    @Getter
    @Setter
    @Access(AccessType.FIELD)
    public class UserRecord {
        @Id
        @GeneratedValue(generator = "uuid")
        @GenericGenerator(name = "uuid", strategy = "uuid2")
        @Column(name = "PR_KEY")
        private String prKey;

        //Business Key
        @Column(name = "businessId", length = 100, unique = false)
        private String businessId;

        //Business Key
        @Column(name = "name", length = 100, nullable = false)
        private String name;

        //Business Key
        @Column(name = "surname", length = 100, nullable = false)
        private String surname;

        @Column(name = "updateDateTime", length = 50, nullable = false)
        private Timestamp updateDateTime;

        @Version
        private int version;

        @Column(name = "user", length = 100000)
        @Lob
        private byte[] user;

        @Column(name = "userXml")
        @Lob
        private String userXml;

        public UserRecord(String businessId, String name, String surname, Timestamp updateDateTime, byte[] user, String userXml) {
            this.businessId = businessId;
            this.name = name;
            this.surname = surname;
            this.updateDateTime = updateDateTime;
            this.user = user;
            this.userXml = userXml;
        }
    }

服务层代码片段在

  record = new RiskMetricRecord(businessId, name, surname, updateDateTimeTimestamp, serialize(userToSave));

 record = new RiskMetricRecord(businessId, name, surname, updateDateTimeTimestamp, serialize(userToSave), userToSave);

我的Jparepository是:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserRepository extends CrudRepository<UserRecord, String> {

}

因此,当我尝试在JPA实体中添加@Lob String字段后将我的实体保存在数据库中时,没有错误消息,但是在数据库中也没有更改。

更多信息:数据库表为

-- auto-generated definition
CREATE TABLE USERRECORD
(
  PR_KEY            VARCHAR2(255 CHAR) NOT NULL
    PRIMARY KEY,
  BUSINESSID VARCHAR2(100 CHAR),
  USER        BLOB,
  NAME    VARCHAR2(100 CHAR) NOT NULL,
  SURNAME     VARCHAR2(100 CHAR) NOT NULL,
  VERSION           NUMBER(10)         NOT NULL,
  UPDATEDATETIME    TIMESTAMP(3),
  USERXML     CLOB
)
/

已尝试:1)

 @Lob
    @Column(name = "userXml", columnDefinition = "CLOB")
    private String userXml;

当我在应用程序中持久保存BLOB时,我尝试了byte [],但它没有保存数据。 然后,我将实体类中属性的数据类型更改为java.sql.Blob,从而解决了该问题。

在您的情况下,您正在使用CLOB,然后将属性的数据类型从String或byte []更改为java.sql.Clob。

@Column(name = "user", length = 100000)
@Lob
private Clob user;

@Column(name = "userXml")
@Lob
private Clob userXml;

因此,在持久实体之前,您必须将user和userXml属性的有效负载转换为Clob对象。

要创建Clob对象,可以使用Hibernate实用程序。

Hibernate.getLobCreator(getHibernateSession()).createClob(stringvar);

在JPA中,您可以轻松使用此处提到的TEXT属性,它将存储任意数量的数据。 同样,无需手动定义长度。 并删除@Lob ,没有必要。 请记住,首先删除数据库中的列,然后重新创建以更新其定义。

@Column(name = "userXml", columnDefinition="TEXT")
private String userXml;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM