Объект JPA не сохранен в базе данных после добавления нового поля @Lob - PullRequest
0 голосов
/ 24 мая 2019

У меня есть проблема, связанная с тем, что объект JPA не сохраняется в базе данных, поэтому после добавления нового поля clob в объекте jpa - объект не сохраняется в базе данных, я использую websphere, spring 4.3.13 и Oracle11g

мой jpa-код до

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

фрагмента кода слоя serice находится до

  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> {

}

Итак, когда я пытаюсь сохранить свою сущность в базе данных после добавления поля @Lob String в сущности JPA - сообщений об ошибках нет, но в базе данных тоже нет изменений..

Дополнительная информация: таблица базы данных:

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Когда я работал над сохранением 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);
0 голосов
/ 24 мая 2019

в JPA, вы можете легко использовать свойство TEXT, как указано здесь, оно будет хранить любое количество данных.Также нет необходимости определять длину вручную.А также удалить @Lob, в этом нет необходимости.Имейте в виду, что сначала удалите ваш столбец в БД и заново создайте его, чтобы обновить его определение.

@Column(name = "userXml", columnDefinition="TEXT")
private String userXml;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...