JPA: làm cách nào để duy trì một Chuỗi vào trường cơ sở dữ liệu, nhập Văn bản MYSQL


81

Yêu cầu là người dùng có thể viết một bài báo, do đó tôi chọn loại Textcho contenttrường bên trong cơ sở dữ liệu mysql. Làm thế nào tôi có thể chuyển đổi Java StringthànhMySQL Text

Của bạn đây Jim Tough

@Entity
public class Article implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long userId;

    private String title;

    private String content;

    private Integer vote;

    //Constructors, setters, getters, equals and hashcode
}

Trong cơ sở dữ liệu MYSQL của tôi, contentlà loại Text. Tôi đã hy vọng rằng sẽ có một cái gì đó như thế này java.sql.Text, vì java.sql.Blobnó là một loại thực tế, nhưng đáng buồn thay, nó không tồn tại

Câu trả lời:


131

Vì bạn đang sử dụng JPA, hãy sử dụng Lobchú thích (và tùy chọn là Columnchú thích). Đây là những gì đặc tả JPA nói về nó:

9.1.19 Chú thích Lob

Một Lobchú thích quy định cụ thể rằng một tài sản dai dẳng hoặc trường nên được tiếp tục tồn như một đối tượng lớn với một loại đối tượng cơ sở dữ liệu lớn hỗ trợ. Các ứng dụng di động nên sử dụng Lobchú thích khi ánh xạ tới loại Lob cơ sở dữ liệu. Chú thích Lob có thể được sử dụng cùng với Basicchú thích. Lob có thể là kiểu nhị phân hoặc kiểu ký tự. Kiểu Lob được suy ra từ kiểu của trường hoặc thuộc tính liên tục, và ngoại trừ kiểu dựa trên chuỗi và ký tự được mặc định là Blob.

Vì vậy, khai báo một cái gì đó như thế này:

@Lob 
@Column(name="CONTENT", length=512)
private String content;

Người giới thiệu

  • Đặc điểm kỹ thuật JPA 1.0:
    • Phần 9.1.19 "Chú thích Lob"

25
Trên Hibernate JPA MYSQL, việc sử dụng @Lobcộng với @Columnchú thích trên trường Chuỗi sẽ cho "loại cột sai, văn bản dài dự kiến ​​nhưng loại cột là văn bản". Nhưng vấn đề được giải quyết khi tôi sử dụng@Column(columnDefinition = "text")
gerrytan

4
Ý nghĩa trong việc kết hợp @Lob@Column(length=512)? Tại sao không chỉ hạnh phúc với @Lob? Cả hai đều không có gì khác biệt khi sử dụng Hibernate JPA MySQL. Cả hai đều dẫn đến kiểu trường MySQL longtext.
Socrates

Tôi có loại cột nhị phân và @Lobchú thích không phù hợp với tôi. Tuy nhiên, @Column(length=8192)đã làm việc tuyệt vời và giải quyết được vấn đề của tôi.
yanni

109

Với @Lobtôi luôn kết thúc với một LONGTEXTtrong MySQL.

Để hiểu, TEXTtôi khai báo theo cách đó (JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text

Tìm cái này tốt hơn, vì tôi có thể trực tiếp chọn Kiểu văn bản mà cột sẽ có trong cơ sở dữ liệu.

columnDefinitionnó cũng tốt để đọc này .

CHỈNH SỬA: Vui lòng chú ý đến bình luận của Adam Siemions và kiểm tra cơ sở dữ liệu bạn đang sử dụng, trước khi áp dụng columnDefinition = "TEXT".


4
Đây không phải là một giải pháp tốt, như cột dữ liệu TEXT không có sẵn trong tất cả các công cụ cơ sở dữ liệu, ví dụ như HSQLDB, chi tiết: stackoverflow.com/questions/4213782/...
Adam Siemion

1
đây là những gì tôi muốn vì nó là những gì có sẵn trong tất cả các cơ sở dữ liệu sản xuất và không có vấn đề với "longtext" khi tôi không muốn.
Nicholas DiPiazza

26

cho mysql 'text':

@Column(columnDefinition = "TEXT")
private String description;

cho mysql 'longtext':

@Lob
private String description;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.