2009-08-15 21 views

Trả lời

310

@Transient phù hợp với nhu cầu của bạn.

+10

Nhưng sau đó jackson sẽ không serialize trường khi chuyển đổi sang JSON ... làm thế nào để giải quyết? – MobileMon

+0

tùy thuộc vào ứng dụng của bạn.nếu bạn chú thích lớp thực thể của bạn - nó áp dụng ở khắp mọi nơi; nhưng nếu bạn anotate dao mà sử dụng thực thể - đó là một câu chuyện khác. trong ngắn hạn: sử dụng DAO khi bạn có nhiều kho – Sarief

+0

@MobileMon kiểm tra câu trả lời của tôi bên dưới về jackson – user3871754

18

Để bỏ qua một trường, hãy chú thích trường đó bằng @Transient để nó sẽ không được ánh xạ theo chế độ ngủ đông.
Nguồn: Hibernate Annotations.

14

Câu trả lời này hơi trễ một chút, nhưng nó hoàn thành phản hồi.

Để tránh một trường từ một thực thể để được tiếp tục tồn tại DB ai có thể sử dụng một trong hai cơ chế:

@Transient - chú thích JPA đánh dấu một lĩnh vực như không persistable

transient từ khóa trong java. Cẩn thận - bằng cách sử dụng từ khóa này, sẽ ngăn chặn trường được sử dụng với bất kỳ cơ chế tuần tự hóa nào từ java. Vì vậy, nếu trường phải được tuần tự hóa, bạn chỉ nên sử dụng chú thích @Transient.

+0

làm thế nào về tôi chỉ muốn bỏ qua sự kiên trì trên phương pháp get ?. Ví dụ: myjparepository.save() wil lưu mô hình như bình thường, và myjparepository.find (id) sẽ bỏ qua trường mà tôi muốn? – xtiger

+0

không biết nếu có thể. Xin lỗi –

2

Để hoàn thành các câu trả lời ở trên, tôi đã có trường hợp sử dụng một tập tin bản đồ XML là nơi chẳng những @Transient cũng không transient làm việc ... tôi đã phải đặt các thông tin thoáng qua trong file xml:

<attributes> 
(...) 
    <transient name="field" /> 
</attributes> 
40

Để bỏ qua một trường, chú thích trường đó bằng @Transient do đó nó sẽ không được ánh xạ bởi chế độ ngủ đông.

nhưng sau đó jackson sẽ không tuần tự hóa trường khi chuyển đổi sang JSON.

Nếu bạn cần trộn JPA với JSON (bỏ qua bởi JPA nhưng vẫn bao gồm ở Jackson) sử dụng @JsonInclude:

@JsonInclude() 
@Transient 
private String token; 

Bạn cũng có thể sử dụng JsonInclude.Include.NON_NULL và ẩn trường trong JSON trong deserialization khi token == null:

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Transient 
private String token; 
+1

Tôi đang chạy JAX-RS 2.0.1/Jersey 2.25.1/Jackson 2.8.7 và với ngăn xếp đó '@ JsonInclude' là không cần thiết: các trường' @ Transient' vẫn được bao gồm trong JSON. (Bạn vẫn nhận được phiếu bầu của tôi: kỹ thuật tự nó có thể rất hữu ích trong các trường hợp khác). – DKroot

1

Không có câu trả lời nào ở trên phù hợp với tôi sử dụng Hibernate 5.2.10, Jersey 2.25.1 và Jackson 2.8.9. Tôi cuối cùng đã tìm thấy câu trả lời (loại, họ tham khảo hibernate4module nhưng nó hoạt động cho 5 quá) here. Không có chú thích Json nào hoạt động cả với @Transient. Rõ ràng Jackson2 đủ 'thông minh' để vui lòng bỏ qua những thứ được đánh dấu bằng @Transient trừ khi bạn nói rõ ràng là không. Chìa khóa là để thêm các module hibernate5 (mà tôi đã sử dụng để đối phó với các chú thích Hibernate khác) và vô hiệu hóa các tính năng USE_TRANSIENT_ANNOTATION trong Application Jersey của tôi:

ObjectMapper jacksonObjectMapper = new ObjectMapper(); 
Hibernate5Module jacksonHibernateModule = new Hibernate5Module(); 
jacksonHibernateModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION); 
jacksonObjectMapper.registerModule(jacksonHibernateModule); 

Đây là sự phụ thuộc cho Hibernate5Module:

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate5</artifactId> 
    <version>2.8.9</version> 
</dependency> 
+0

Sau khi thử mọi phương pháp khác đề cập ở trên và những người khác '@ JsonProperty' ' @ JsonInclude' '@JsonSerialize + @ JsonDeserialize'' mapper.configure (MapperFeature.PROPAGATE_TRANSIENT_MARKER, false)); ' giải pháp này cuối cùng làm việc. Cảm ơn! – Aceonline

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