2011-01-17 30 views
8

Giả sử tôi có lớp học này:Tôi có thể sử dụng mẫu thiết kế trình xây dựng cùng với hibernate không?

public class MyEntity { 
    private int id; 
    private String name; 
    private MyEntity(int id, String name) {this.id= id; this.name = name;} 
    public static class MyEntityBuilder { 
    private int id; 
    private String name; 
    private MyEntityBuilder setId(int id) {this.id = id;} 
    private MyEntityBuilder setName(String name) {this.name = name;} 
    private MyEntity build() {return new MyEntity(id,name);} 
    } 
    private int getId() {return id;} 
    private String getName() {return name;} 
} 

Tôi có thể sử dụng chú thích ngủ đông để ánh xạ nó vào một bảng?

Trả lời

4

Trình tạo là một cơ chế bên ngoài để tạo đối tượng. Đó là đủ mà bạn cung cấp một constructor mặc định cho thực thể của bạn, và hibernate sẽ không quan tâm làm thế nào bạn có được nó. Vì vậy, có - có thể, giống như một thực thể bình thường.

5

Có và không. Bạn có thể sử dụng nó nếu bạn cũng cung cấp setters.

Hibernate sử dụng Java Đậu để truy cập các thuộc tính, do đó, nó dựa trên các phương thức getXXX()setXXX(). Toàn bộ điểm của mẫu xây dựng (ít nhất là theo Joshua Bloch) là tạo ra các đối tượng bất biến mà không có người định cư. Điều này sẽ không làm việc với Hibernate (hoặc bất kỳ ORM), khi họ sử dụng các setters để tiêm các giá trị. Tuy nhiên, nếu bạn chỉ muốn sử dụng API của trình xây dựng làm giao diện thông thạo để tạo các đối tượng trong khi vẫn để nguyên getters và setters, thì dĩ nhiên không có hại gì (ngoài việc sao chép mã).

BTW: Bộ định vị lưu loát không phải là bộ định cư đậu Java hợp lệ. Cơ chế Introspector không hiểu chúng. Người định cư phải có loại trả lại khoảng trống.

+0

là như vậy? Tôi nghĩ rằng nếu bạn chọn quyền truy cập tài sản (đặt @Column tại tài sản, không phải trên các phương pháp truy cập) người ta có thể làm với những người định cư trong hibernate? hoặc làm cho chúng được prackage riêng .. những gì về lớp Builder bên trong từ mô hình. Đó có phải là một vấn đề cho Hibernate? – bert

+1

@bert cẩn thận với từ ngữ của bạn: những gì bạn mô tả là truy cập trường, không truy cập thuộc tính. Trong Java, một thuộc tính được định nghĩa bởi các phương thức getter và/hoặc setter của nó, chứ không phải bởi trường cơ bản. Nó có thể hoạt động khi chú thích các trường, nhưng không phải nếu các trường được đánh dấu là cuối cùng (được coi là thực hành tốt cho các đối tượng được tạo bằng trình tạo). Không, lớp bên trong không phải là vấn đề, miễn là nó tĩnh và không được đánh dấu là @Entity. –

+0

cảm ơn. Và bạn tất nhiên là đúng. tôi có nghĩa là truy cập tài sản. Trường hợp sử dụng của tôi là nơi các trường được ánh xạ là 'updatable = false' và tôi muốn thực thi điều đó trong api. – bert

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