जवाबों:
@Transient
अपनी आवश्यकताओं का अनुपालन करता है।
किसी फ़ील्ड को अनदेखा करने के लिए, उसे एनोटेट करें @Transient
ताकि उसे हाइबरनेट द्वारा मैप न किया जा सके।
लेकिन तब जैक्सन JSON में परिवर्तित होने पर क्षेत्र को क्रमबद्ध नहीं करेगा ।
आप JSON साथ जेपीए मिश्रण की जरूरत है (जेपीए द्वारा छोड़ देते हैं, लेकिन अभी भी जैक्सन में शामिल हैं) का उपयोग करें @JsonInclude
:
@JsonInclude()
@Transient
private String token;
सुझाव:
आप JsonInclude.Include.NON_NULL का उपयोग भी कर सकते हैं और डीसरीकरण के दौरान JSON में फ़ील्ड छिपा सकते हैं token == null
:
@JsonInclude(JsonInclude.Include.NON_NULL)
@Transient
private String token;
@JsonInclude
आवश्यक नहीं है: @Transient
फ़ील्ड अभी भी JSON में शामिल हैं। (आपने अभी भी मेरा वोट प्राप्त किया है: तकनीक स्वयं अन्य परिस्थितियों में बहुत उपयोगी हो सकती है)।
किसी फ़ील्ड को अनदेखा करने के लिए, उसे एनोटेट करें @Transient
ताकि उसे हाइबरनेट द्वारा मैप न किया जा सके।
स्रोत: हाइबरनेट एनोटेशन ।
यह उत्तर थोड़ी देर से आता है, लेकिन यह प्रतिक्रिया को पूरा करता है।
एक इकाई से एक क्षेत्र को डीबी में बनाए रखने के लिए दो तंत्रों में से एक का उपयोग करने के लिए:
@ ट्रैंसिएंट - जेपीए एनोटेशन एक क्षेत्र के रूप में चिह्नित करने योग्य नहीं है
जावा में क्षणिक खोजशब्द। खबरदार - इस कीवर्ड का उपयोग करने से, जावा से किसी भी क्रमिक तंत्र के साथ उपयोग किए जाने वाले क्षेत्र को रोका जा सकेगा। इसलिए, यदि क्षेत्र को क्रमबद्ध किया जाना चाहिए तो आप सिर्फ @ ट्रांसेन्ट एनोटेशनका बेहतर उपयोग करेंगे ।
इकाई विशेषता प्रकार के आधार पर कई समाधान हैं।
निम्नलिखित account
तालिका पर विचार करें :
account
मेज पर मैप किया गया है Account
इस तरह इकाई:
@Entity(name = "Account")
public class Account {
@Id
private Long id;
@ManyToOne
private User owner;
private String iban;
private long cents;
private double interestRate;
private Timestamp createdOn;
@Transient
private double dollars;
@Transient
private long interestCents;
@Transient
private double interestDollars;
@PostLoad
private void postLoad() {
this.dollars = cents / 100D;
long months = createdOn.toLocalDateTime()
.until(LocalDateTime.now(), ChronoUnit.MONTHS);
double interestUnrounded = ( ( interestRate / 100D ) * cents * months ) / 12;
this.interestCents = BigDecimal.valueOf(interestUnrounded)
.setScale(0, BigDecimal.ROUND_HALF_EVEN).longValue();
this.interestDollars = interestCents / 100D;
}
//Getters and setters omitted for brevity
}
बुनियादी इकाई गुण तालिका स्तंभ पर मैप किए जाते, तो गुण की तरह है id
, iban
, cents
बुनियादी विशेषताएँ हैं।
लेकिन dollars
, interestCents
है, और interestDollars
, गुण का परिकलन किया जाता है ताकि आप उन्हें साथ उनकी व्याख्या @Transient
उनका चयन, सम्मिलित करें, अपडेट करें और हटाएं SQL कथन से बाहर करने के लिए।
इसलिए, मूलभूत विशेषताओं के लिए, आपको
@Transient
दी गई संपत्ति को बनाए रखने से बाहर रखने के लिए उपयोग करने की आवश्यकता है ।गणना की गई इकाई विशेषताओं के बारे में अधिक जानकारी के लिए, इस लेख को देखें ।
मान लें कि आपके पास निम्नलिखित post
और post_comment
टेबल हैं:
आप इकाई में नवीनतम इकाई के लिए lastestComment
एसोसिएशन को मैप करना चाहते हैं जिसे जोड़ा गया था।Post
PostComment
ऐसा करने के लिए, आप @JoinFormula
एनोटेशन का उपयोग कर सकते हैं :
@Entity(name = "Post")
@Table(name = "post")
public class Post {
@Id
private Long id;
private String title;
@ManyToOne(fetch = FetchType.LAZY)
@JoinFormula("(" +
"SELECT pc.id " +
"FROM post_comment pc " +
"WHERE pc.post_id = id " +
"ORDER BY pc.created_on DESC " +
"LIMIT 1" +
")")
private PostComment latestComment;
//Getters and setters omitted for brevity
}
Post
इकाई लाते समय , आप देख सकते हैं कि latestComment
यह प्राप्त है, लेकिन यदि आप इसे संशोधित करना चाहते हैं, तो परिवर्तन को अनदेखा किया जाएगा।
इसलिए, संघों के लिए, आप एसोसिएशन
@JoinFormula
को पढ़ने की अनुमति देते हुए लेखन कार्यों की उपेक्षा कर सकते हैं ।संगणित संघों के बारे में अधिक जानकारी के लिए, इस लेख को देखें ।
संघ पहचानकर्ता द्वारा पहले से मैप किए गए संघों को अनदेखा करने का दूसरा तरीका उपयोग करना है @MapsId
।
उदाहरण के लिए, निम्नलिखित एक-से-एक तालिका संबंध पर विचार करें:
PostDetails
इकाई इस तरह मैप किया गया है:
@Entity(name = "PostDetails")
@Table(name = "post_details")
public class PostDetails {
@Id
private Long id;
@Column(name = "created_on")
private Date createdOn;
@Column(name = "created_by")
private String createdBy;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
private Post post;
public PostDetails() {}
public PostDetails(String createdBy) {
createdOn = new Date();
this.createdBy = createdBy;
}
//Getters and setters omitted for brevity
}
ध्यान दें कि id
विशेषता और post
एसोसिएशन दोनों समान डेटाबेस कॉलम को मैप करते हैं, जो post_details
प्राथमिक कुंजी कॉलम है।
id
विशेषता को बाहर करने के लिए , @MapsId
एनोटेशन हाइबरनेट को बताएगा कि post
एसोसिएशन तालिका का ध्यान रखता है प्राथमिक कुंजी स्तंभ मान।
इसलिए, जब इकाई पहचानकर्ता और एक एसोसिएशन समान कॉलम साझा करते हैं, तो आप
@MapsId
इकाई पहचानकर्ता विशेषता को अनदेखा करने के लिए उपयोग कर सकते हैं और इसके बजाय एसोसिएशन का उपयोग कर सकते हैं ।के बारे में अधिक जानकारी के लिए
@MapsId
, इस लेख को देखें ।
insertable = false, updatable = false
एक अन्य विकल्प insertable = false, updatable = false
एसोसिएशन के लिए उपयोग करना है जिसे आप हाइबरनेट द्वारा अनदेखा करना चाहते हैं।
उदाहरण के लिए, हम पिछले एक-से-एक एसोसिएशन को इस तरह से मैप कर सकते हैं:
@Entity(name = "PostDetails")
@Table(name = "post_details")
public class PostDetails {
@Id
@Column(name = "post_id")
private Long id;
@Column(name = "created_on")
private Date createdOn;
@Column(name = "created_by")
private String createdBy;
@OneToOne
@JoinColumn(name = "post_id", insertable = false, updatable = false)
private Post post;
//Getters and setters omitted for brevity
public void setPost(Post post) {
this.post = post;
if (post != null) {
this.id = post.getId();
}
}
}
insertable
और updatable
की विशेषताओं @JoinColumn
एनोटेशन की अनदेखी करने के हाइबरनेट निर्देश देगा post
इकाई पहचानकर्ता का ख्याल रखता है के बाद से संघ post_id
प्राथमिक कुंजी स्तंभ।
post
और post_details
तालिकाओं के संदर्भ में सही है ?
उपरोक्त उत्तरों में से किसी ने भी मेरे लिए हाइबरनेट 5.2.10, जर्सी 2.25.1 और जैक्सन 2.8.9 का उपयोग करके काम किया। मुझे अंत में उत्तर मिला (जैसे, वे हाइबरनेट 4module का संदर्भ देते हैं लेकिन यह यहां भी 5 के लिए काम करता है) । जोंस के किसी भी एनोटेशन ने बिल्कुल भी काम नहीं किया @Transient
। जाहिरा तौर पर जैक्सन 2 'स्मार्ट' है, @Transient
जब तक आप स्पष्ट रूप से इसे नहीं बताएंगे, तब तक कृपया उस पर ध्यान न दें। कुंजी हाइबरनेट 5 मॉड्यूल को जोड़ने के लिए थी (जिसका उपयोग मैं अन्य हाइबरनेट एनोटेशन से निपटने के लिए कर रहा था) और USE_TRANSIENT_ANNOTATION
अपने जर्सी एप्लिकेशन में सुविधा को अक्षम कर रहा हूं:
ObjectMapper jacksonObjectMapper = new ObjectMapper();
Hibernate5Module jacksonHibernateModule = new Hibernate5Module();
jacksonHibernateModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
jacksonObjectMapper.registerModule(jacksonHibernateModule);
यहाँ Hibernate5Module के लिए निर्भरता है:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.8.9</version>
</dependency>
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
इस समाधान ने आखिरकार काम किया। धन्यवाद!