2010-03-22 27 views
6

Tôi đang tìm một cách để tồn tại một thực thể có chứa một lĩnh vực của một loại người dùng. Trong ví dụ cụ thể này, tôi muốn duy trì trường ts là số mili giây.Làm thế nào để tồn tại một thực thể có chứa một lĩnh vực của người sử dụng loại bằng cách sử dụng JPA2

import org.joda.time.DateTime; 

@Entity 
public class Foo { 

    @Id 
    private Long id; 

    private DateTime ts; 
} 

Trả lời

6

JPA không có khả năng để đăng ký các loại tài sản tùy chỉnh, bạn sẽ phải sử dụng nhà cung cấp công cụ cụ thể:

+2

Không thể tin rằng chúng không xây dựng trong bộ điều hợp giống như trong JAXB: public class DateAdapter mở rộng XmlAdapter {... –

1

Vì đây không phải là loại được hỗ trợ do JPA xác định mà bạn dựa vào chi tiết triển khai. DataNucleus có một plugin cho JodaTime mà sẽ cho phép sự kiên trì mong muốn của bạn.

1

Hoặc bạn có thể sử dụng các công cụ cụ thể của nhà cung cấp đó hoặc bạn có thể sử dụng các phương thức gọi lại @PostPersist, @PostUpdate, @PostLoad gọi lại với trường thay thế @Transient.

http://www.java2s.com/Tutorial/Java/0355__JPA/EntityListenerPostLoad.htm sẽ cung cấp cho bạn một số ý tưởng.

Vui lòng liên hệ để được giải thích thêm.

+0

@Mick Vâng, bạn luôn có thể tuần tự hóa đối tượng Serializable tùy chỉnh của mình thành '@ LOB' [http://www.java2s.com/Tutorial/Java/0355__JPA/MarkStringAsLob.htm] –

1

Một giải pháp là sử dụng các thuộc tính không phải cột và đóng gói chúng bằng getters/setters.

Để nói JPA sử dụng getters/setters thay vì trực tiếp accesing lĩnh vực tư nhân, bạn phải chú thích @ id trên công dài getId() thay vì tin dài id. Khi thực hiện điều này, chỉ cần nhớ sử dụng @Transient cho mỗi trình thu thập dữ liệu không tương ứng trực tiếp với một cột.

Ví dụ sau sẽ tạo cột ngày có tên myDate, trong khi ứng dụng sẽ có phương thức getTime() và setTs() DateTime có sẵn cho nó. (không chắc chắn về API DateTime, vì vậy vui lòng tha thứ cho các lỗi nhỏ :))

import org.joda.time.DateTime; 

@Entity 
public class Foo { 

    private Long id; 

    private DateTime ts; 

    @Id 
    public Long getId() { return id; } 

    public void setId(Long id) { this.id = id; } 



    // These should be accessed only by JPA, not by your application; 
    // hence they are marked as protected 

    protected Date getMyDate() { return ts == null ? null : ts.toDate(); } 

    protected void setMyDate(Date myDate) { 
    ts = myDate == null ? null : new DateTime(myDate); 
    } 



    // These are to be used by your application, but not by JPA; 
    // hence the getter is transient (if it's not, JPA will 
    // try to create a column for it) 

    @Transient 
    public DateTime getTs() { return ts; } 

    public void setTs(DateTime ts) { this.ts = ts; } 
} 
Các vấn đề liên quan