2012-07-11 27 views
5

Tôi cố gắng để lưu trữ giá trị null của một liệt kê thuộc tính của một thực thể trong Java để Oracle cơ sở dữ liệu sử dụng JPA TopLink. Mã được thực hiện mà không có ngoại lệ hoặc cảnh báo, nhưng thực thể không được lưu trữ trong cơ sở dữ liệu.Có thể lưu trữ giá trị null của thuộc tính được liệt kê vào cơ sở dữ liệu không?

Các thực thể được định nghĩa như sau:

@Entity 
public class LetterDoc { 
    ... 
    @Column(name = "delivery_type", columnDefinition = "VARCHAR2(20)", nullable = true) 
    @Enumerated(EnumType.STRING) 
    private DocDeliveryTypeEnum deliveryType; 
    ... 
} 

Các Enum lớp DocDeliveryTypeEnum đã chỉ giá trị yêu cầu.

public enum DocDeliveryTypeEnum { 
    NORMAL, 
    RECOMMENDED, 
    ACKNOWLEDGEMENT 
} 

Trong trường hợp của tôi, tôi có trường hợp các loại phân phối tạo ra hàng rào và được yêu cầu. Tuy nhiên, đối với một số trường hợp, loại phân phối là không liên quan và tôi muốn giữ nguyên nó null. Tôi không muốn đặt giá trị mặc định vì không có giá trị đầy đủ cho trường hợp này.

Ví dụ thực thể có giá trị được đặt thành rỗng, nhưng khi tôi cố gắng lưu giữ và xóa phiên bản trong cơ sở dữ liệu, nó không được lưu trữ, mặc dù cột được định nghĩa là VARCHAR2 (20) với giá trị NULL được bật.

Tình hình là như thế này:

LetterDoc let = new LetterDoc(); 
// settery ostatnich atributu 
let.setDeliveryType(null); 
try { 
    emptyDocDAO.persist(let); 
    emptyDocDAO.flush(); 
} catch (Exception e) { 
    // no exception is really catched :(
    log.error(e); 
} 
// here I have the id of the entity 

Thực sự không có ngoại lệ được ném trong khi kiên trì, chỉ là thực thể không được lưu trữ. Khi tôi cố gắng để có được các thực thể sau này trong một thread của ID, nó không thành công với NoResultException.

Có cơ hội để thực hiện công việc này hay tôi thực sự phải đặt giá trị cho tất cả các thuộc tính được liệt kê trước khi lưu giữ? Tôi có thực sự phải tạo một giá trị mặc định trong lớp Enum không?

Tôi đã giải quyết được sự cố của mình bằng cách đặt giá trị mặc định không có ý nghĩa nhiều trong tình huống cụ thể. Tuy nhiên, tôi tự hỏi nếu có bất kỳ tùy chọn khác.

Cảm ơn bạn rất nhiều vì kinh nghiệm và lời khuyên của bạn.

+2

Nó sẽ có thể lưu null trong cột. Hiển thị mã nơi bạn cố gắng thực hiện và theo dõi ngăn xếp đầy đủ của ngoại lệ bạn nhận được. –

+0

thử điều này trong bạn enum thành viên: columnDefinition = "char (20) mặc định 'NULL'" – shem

+0

@ JBNizet: Tôi thực sự không nhận được bất kỳ ngoại lệ. Đó là những gì tôi tự hỏi về nhiều nhất: ( – Sharg

Trả lời

1

Có, bạn có thể lưu trữ giá trị rỗng cho thuộc tính enum.

Tôi không thể thấy làm thế nào bạn có thể không nhận được gì, là một ngoại lệ xảy ra mà bạn không bắt?

Bật ghi nhật ký tốt nhất và bao gồm nhật ký và mã của bạn và nắm bắt bất kỳ ngoại lệ nào và bao gồm theo dõi ngăn xếp.

+1

Tôi đã thêm một số mã khác để hiển thị cách tôi lưu trữ đối tượng.Tuy nhiên, ngay cả khi bắt ngoại lệ, không có gì bị ném và bị bắt: ( – Sharg

0

Mã nên ném NullPointerException khi bạn đang cố lưu giá trị null vào enum. Phương thức Enum.valueOf() ném NullPointerException nếu tên là null.

let.setDeliveryType (null);

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