2011-10-21 25 views
6

Tôi có một EntityBean đơn giản với chú thích @Lob. Nếu tôi xóa chú giải này, tôi sẽ không gặp lỗi nào trên JBossAS 6.0.0.Final và MySQL5. Nhưng nếu tôi chú thích nó với @Lob (vì mt chứa khoảng 100 đến 5000 ký tự trong trường hợp của tôi) tôi gặp lỗi trong môi trường thử nghiệm của mình nếu tôi vẫn tồn tại thực thể.JBoss6 JPA: Thực thể có kết quả @Lob trong GenericJDBCException

  • mà không @Lob: mt được ánh xạ tới VARCHAR
  • với @Lob: mt được ánh xạ tới LONGTEXT (đây là những gì tôi muốn, nhưng tôi nhận được lỗi)

này thực thể của tôi:

@Entity 
@Table(name = "Description") 
public class Description implements Serializable 
{ 
    public static final long serialVersionUID=1; 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private long id; 

    @Lob 
    private String mt; 
} // ... getter/setter 

Lỗi ở đây:

... 
Caused by: org.hibernate.exception.GenericJDBCException: could not insert 
    [my.Description] 
... 
Caused by: java.sql.SQLException: Connection is not associated with a managed 
    connec[email protected]3e4dd 
... 

Tôi thực sự không biết tại sao tôi gặp lỗi này (có thể tái tạo). Môi trường có vẻ ổn, nhiều thử nghiệm khác được chuyển và thậm chí nó còn hoạt động mà không có chú thích @Lob.

Câu hỏi này có liên quan đến JPA: how do I persist a String into a database field, type MYSQL Text, trong đó việc sử dụng @Lob cho JPA/MySQL là câu trả lời được chấp nhận.

Cập nhật 1 Lỗi ở trên là hệ điều hành cụ thể. Trên máy W7, tôi không gặp vấn đề gì với @Lob, với OSX Lion luôn có lỗi. Tôi sẽ cố gắng cập nhật MySQL và trình điều khiển.

Cập nhật 2 Cách giải quyết được đề xuất bởi Kimi với @Column(columnDefinition = "longtext") hoạt động tốt, ngay cả trên OSX. Trong cả hai trường hợp, MySQL tạo cùng một cột: LONGTEXT.

Cập nhật 3 Tôi đã cập nhật MySQL thành mysql-5.5.17-osx10.6-x86_64 và trình kết nối tới mysql-connector-java-5.1.18. Vẫn là lỗi tương tự.

+2

không bảng mô tả của bạn trông như thế nào? Nếu mt là một varchar trong cơ sở dữ liệu của bạn thì tại sao bạn muốn thử ánh xạ nó đến một Lob? –

+0

Liệu MySQL5 có hỗ trợ LONGTEXT như một giá trị chính xác để tạo một mã định danh không? Tôi không chắc làm thế nào DB nên làm điều đó ... tăng giá trị văn bản? –

+0

@PedroKowalski mt không được sử dụng làm mã định danh. Trường id là. Đây là cách tôi đọc nó lúc đầu nhưng nó chỉ là định dạng kém của mã. –

Trả lời

4

Không có cần để chú thích thuộc tính Chuỗi với @Lob. Chỉ cần đặt độ dài cột với @Column(length = 10000).

EDIT:

Hơn nữa, bạn luôn có thể thiết lập độ dài tới giá trị tối đa cụ thể cơ sở dữ liệu của bạn, cũng như xác định các loại cột với các thiết lập columndefinition để nào phù hợp với nhu cầu của bạn.

Ví dụ, nếu bạn đang sử dụng MySQL 5.0.3 hoặc mới hơn, số tiền tối đa của dữ liệu có thể được lưu trữ trong từng loại dữ liệu như sau:

  • VARCHAR: 65.535 byte (~ 64Kb, 21.844 UTF-8 ký tự mã hóa)
  • TEXT: 65.535 byte (~ 64Kb, 21.844 ký tự UTF-8 mã hóa)
  • MEDIUMTEXT: 16.777.215 byte (~ 16Mb, ~ 5,5 triệu ký tự UTF-8 mã hóa)
  • LONGTEXT: 4,294,967,295 byte (~ 4GB, ~ 1,4 tỷ ký tự mã hóa UTF-8).

Như tôi đã hiểu, @Lob chỉ đặt loại cột và độ dài tùy thuộc vào cơ sở dữ liệu bên dưới.

+0

Điều gì sẽ xảy ra nếu Chuỗi có một số lý do hơn 10000 ký tự? Vui lòng xem, http://stackoverflow.com/questions/3868096 – Thor

+2

Vâng, bạn luôn có thể đặt độ dài cho giá trị tối đa của cơ sở dữ liệu cụ thể của mình, cũng như xác định loại cột với cài đặt 'columndefinition' cho phù hợp với nhu cầu của bạn. Ví dụ, nếu bạn đang sử dụng MySQL 5.0.3 hoặc mới hơn, độ dài tối đa cho một VARCHAR được mã hóa UTF-8 là 21.844 ký tự (65.535 byte), giống như giới hạn của kiểu TEXT. MEDIUMTEXT có thể chứa 16,777,215 byte (~ 16Mb, ~ 5,5 triệu ký tự) và LONGTEXT 4,294,967,295 byte (~ 4GB, ~ 1,4 tỷ ký tự). Như tôi đã hiểu, '@ Lob' chỉ đặt loại cột và độ dài cho một số giá trị cơ sở dữ liệu cụ thể. – Kimi

+0

Vì vậy, nếu tính di động không phải là một vấn đề, tôi sẽ đi với điều này. – Kimi

2

Một cách khác mà làm việc cho tôi là để cập nhật cấu hình ra mắt của JBoss với

-Dhibernate.jdbc.use_streams_for_binary=true 

Tôi đang chạy jBoss6 với MySQL5

Các vấn đề liên quan