উত্তর:
@Transient
আপনার প্রয়োজন মেনে চলা।
কোনও ক্ষেত্রকে অগ্রাহ্য করতে, এটিকে এনারেট করুন @Transient
যাতে এটি হাইবারনেট দ্বারা ম্যাপ করা যায় না।
তবে জ্যাকসন জেএসএনে রূপান্তর করার সময় ক্ষেত্রটিকে সিরিয়ালাইজ করবেন না ।
আপনার যদি জেএসএনের সাথে জেপিএ মিশ্রণের প্রয়োজন হয় (জেপিএ বাদ দিয়ে তবে জ্যাকসনের মধ্যে অন্তর্ভুক্ত) ব্যবহার করুন @JsonInclude
:
@JsonInclude()
@Transient
private String token;
পরামর্শ:
আপনি জেসনআইনক্লিউডও অন্তর্ভুক্ত করুন ONনোন_নুল এবং ডিএসরিয়ালেসনের সময় জেএসএন-তে ক্ষেত্রগুলি লুকিয়ে রাখতে পারেন যখন token == null
:
@JsonInclude(JsonInclude.Include.NON_NULL)
@Transient
private String token;
@JsonInclude
প্রয়োজনীয় নয়: @Transient
ক্ষেত্রগুলি এখনও জেএসএনে অন্তর্ভুক্ত রয়েছে। (আপনি এখনও আমার ভোট পেয়েছেন: কৌশলটি নিজেও অন্যান্য পরিস্থিতিতে খুব কার্যকর হতে পারে)।
কোনও ক্ষেত্রকে অগ্রাহ্য করতে, এটিকে এনারেট করুন @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
সেগুলি নির্বাচন, সন্নিবেশ আপডেট করে এবং মোছে এসকিউএল স্টেটমেন্ট থেকে বাদ দেওয়ার।
সুতরাং, মৌলিক বৈশিষ্ট্যের জন্য,
@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 ব্যবহার করে কাজ করা হয়নি। পরিশেষে আমি উত্তর পাওয়া (সাজানোর, তারা hibernate4module রেফারেন্স কিন্তু এতে 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);
হাইবারনেট 5 মডুলের জন্য এখানে নির্ভরতা রয়েছে:
<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));
সমাধানের পরে এই সমাধানটি শেষ পর্যন্ত কাজ করেছে। ধন্যবাদ!