2013-02-15 113 views
8

Với lớp này ánh xạ với JPA (sử dụng JPA 1.0 và Hibernate):Kiểu nguyên thủy trong ánh xạ JPA. Điều gì nếu cột cơ sở dữ liệu có thể là NULL?

@Entity 
public class Foo { 

    private int bar; 

    /* ... */ 
} 
  1. gì sẽ xảy ra nếu tôi cố gắng tải một kỷ lục mà có BAR cột thiết lập để NULL?
  2. Tôi có thể chỉ định cách đặt trường bar khi cột tương ứng là NULL không?

Ghi chú

Tôi biết điều này không phải là một thực hành tốt nhất. Câu hỏi đặt ra là tò mò hơn và được lấy cảm hứng từ tình huống này:

  • Bảng cơ sở dữ liệu là bảng dàn xếp: thêm NOT NULL ràng buộc là không thực tế. Dữ liệu xấu được mong đợi và điểm của mã của tôi là xác thực, dọn dẹp và/hoặc từ chối dữ liệu trước khi tải nó vào cơ sở dữ liệu "thực".
  • Tôi có các giá trị mặc định được chấp nhận cho một số trường. Ví dụ: cờ boolean sẽ mặc định là false.
+3

Nếu cột db có thể chứa null, bạn thực sự nên sử dụng lớp trình bao bọc để biểu thị giá trị. – Perception

Trả lời

2
  1. Exception

2.

@Column(name = “bar”, nullable = false, columnDefinition = “bigint(20) default 0″) 
private int bar; 

nó giải quyết vấn đề của bạn.

+0

Nhưng với điểm 2 tôi cần phải thay đổi định nghĩa cột cơ sở dữ liệu, phải không? –

+0

Tôi đồng ý rằng nếu bạn thực sự muốn có một đại diện Null bạn chỉ nên thay đổi thanh để Integer. Nhưng nếu bạn muốn tránh null, bạn có thể đặt giá trị mặc định. – Matheus

+0

Nhân tiện, tôi nghĩ các kiểu nguyên thủy đã có giá trị mặc định. Nhưng nếu bạn đã có một cột với các mục rỗng, thì thay đổi thanh thành Integer là giải pháp. – Matheus

11

Tôi muốn sử dụng các đối tượng nếu cột có thể chứa giá trị null vì ý tưởng của Matheus đưa ra dữ liệu sai. NULL <> 0!

+0

bạn có thể giải thích ý nghĩa của dữ liệu sai ở đây không. Matheus là thiết lập mặc định là 0 và nullable = false, vì vậy nó sẽ không bao giờ rỗng. bạn có ý gì bởi dữ liệu xấu/sai? – Ankit

+2

'columnDefinition' chỉ được sử dụng * * cho việc tạo DDL (tức là tạo các câu lệnh để tạo và thay đổi bảng), vì vậy giá trị mặc định sẽ là giá trị mặc định của nguyên thủy. Trong thực tế, bạn không nên tạo các cột với các giá trị mặc định khi bạn sử dụng JPA. Nếu trường của bạn là một trường nguyên thủy, nó sẽ mặc định là giá trị mặc định của kiểu nguyên thủy. Nếu trường của bạn là một đối tượng, cơ sở dữ liệu sẽ đặt giá trị mặc định như được định nghĩa trong bảng của bạn, nhưng đối tác của cột trong đối tượng thực thể được chèn sẽ không được cập nhật để phản ánh giá trị mặc định. –