Подтвердить что ты не робот

Плохое значение для типа long: - Postgresql, Hibernate, Spring

Я хочу сохранить объект (String + изображение) в PostgresQL с помощью Spring MVC и Hibernate Вот мой стол. Предполагается, что изображение должно быть типом oid.

CREATE TABLE document
(
  name character varying(200),
  id serial NOT NULL,
  content oid,   // that should be the image
  CONSTRAINT document_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);

Вот объект, который я хочу сохранить.

    @Entity
    @Table(name = "document")
    public class Document {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;

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

        @Column(name="content")
            private Blob content;  //this is the image
//getters- setters

Вы можете видеть, что переменная "name" является строкой, а не длинной. Тем не менее, когда я отправляю форму со значением, которое не является числовым, оно бросает org.postgresql.util.PSQLException: Bad value for type long : x

вот форма:

<form:form method="post" action="save.html" commandName="document" enctype="multipart/form-data">
    <form:errors path="*" cssClass="error"/>
    <table>
    <tr>
        <td><form:label path="name">Name</form:label></td>
        <td><form:input path="name" /></td> 
    </tr>

     <tr>
        <td><form:label path="content">Document</form:label></td>
        <td><input type="file" name="file" id="file"></input></td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="Add Document"/>
        </td>
    </tr>
</table>  
</form:form>

Если я введу числовое значение и отправлю его, нажмите "ОК". Но любое нечисловое значение вызывает вышеупомянутое исключение... Я читал, что это может быть вызвано тем, что я неправильно использую OID, но я не знаю, что мне следует сделать, чтобы исключить это исключение. На самом деле я тоже не понимаю названия экскрементов. Он говорит "Плохое значение для типа long". но кто хочет типа долго? переменная "name" имеет тип String!!!!

Наконец, вот контроллер

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@ModelAttribute("document") Document document, @RequestParam("file") MultipartFile file) {

    try {
        Blob blob = Hibernate.createBlob(file.getInputStream());
        document.setContent(blob);
        documentDao.save(document);
    } catch (Exception e) {
        e.printStackTrace();
    }


    return "redirect:/index.html";
}

Приняты любые советы.

4b9b3361

Ответ 1

когда я создал таблицу, столбец "имя" оказался первым. Это нехорошо. Идентификатор должен быть первым столбцом. Если я меняю порядок столбцов, он отлично работает...

Ответ 2

У меня была аналогичная проблема, но она не была связана с порядком поля ID в базе данных.

После некоторого поиска я нашел this, указав на то, что Lobs in Hibernate рассматриваются как OID, если не указано иное.

Это означает, что Hibernate попытается поместить Lob в Long a, следовательно, создаст это исключение PSQLException: Плохое значение для типа long

Способ указать, что Lob является обработанным как текст, путем аннотирования поля

@Lob
@Type(type = "org.hibernate.type.TextType")

Ответ 3

Я столкнулся с ошибкой smiler, и причина заключалась в том, что у меня были некоторые символы, отличные от целого, в виде целочисленного типа данных

например, 111, 144 и т.д.