我有一個Java Spring MVC控制器應用程序。它使用休眠4和彈簧3。使用Bitronix事務管理休眠忽略與ManyToOne關係屬性上的設置值
下面是我的一些模型類的
User.java
public class User implements java.io.Serializable {
private Integer userId;
private String userName;
private String emailId;
private Set<Jobs> jobses = new HashSet<Jobs>(0);
//getters and setters
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="user")
public Set<Jobs> getJobses() {
return this.jobses;
}
public void setJobses(Set<Jobs> jobses) {
this.jobses = jobses;
}
}
Jobs.java
@NamedQueries({
@NamedQuery(
name = "findJobsByUser",
query = "from Jobs jobs where jobs.user = :user"
)
})
@JsonIgnoreProperties("user")
@Entity
@Table(name="jobs"
,catalog="mydb"
)
public class Jobs implements java.io.Serializable {
private Integer jobId;
private User user;
private String jobName;
private Set<Tasks> taskses = new HashSet<Tasks>(0);
//getters & setters
@XmlTransient
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="UserId")
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="jobs")
public Set<Tasks> getTaskses() {
return this.taskses;
}
public void setTaskses(Set<Tasks> taskses) {
this.taskses = taskses;
}
}
Tasks.java
public class Tasks implements java.io.Serializable {
private Integer taskId;
private Jobs jobs;
private String taskName;
private Set<Process> processes = new HashSet<Process>(0);
//getters & setters
@XmlTransient
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name="JobId")
public Jobs getJobs() {
return this.jobs;
}
public void setJobs(Jobs jobs) {
this.jobs = jobs;
}
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="tasks")
public Set<Process> getProcesses() {
return this.processes;
}
public void setProcesses(Set<Process> processes) {
this.processes = processes;
}
}
Process.java
public class Process implements java.io.Serializable {
private Integer processId;
private Tasks tasks;
private String processName;
//getters and setters
@XmlTransient
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="TaskId")
public Tasks getTasks() {
return this.tasks;
}
public void setTasks(Tasks tasks) {
this.tasks = tasks;
}
}
在使用命名查詢我的控制,我想獲得的所有作業。
JobsDetailsController.java控制器方法
@RequestMapping(value = "/jobsdeatils/{userId}", method = RequestMethod.GET)
@ResponseBody
public List<Jobs> jobsDetails(@PathVariable Integer userId) throws IOException {
try {
User user=userService.findById(userId);
Map<String, Object> queryParams=new LinkedHashMap<String, Object>();
queryParams.put("user", user);
jobs=jobsService.findByNamedQuery("findJobsByUser", queryParams);
} catch(Exception e) {
logger.debug(e.getMessage());
}
return jobs;
}
我能夠得到的數據,但它需要更多的時間進行大量的數據。轉換爲JSON時出現錯誤。然後我發現它正在發生無限循環,正在發生StackOverflowException
。我爲所有不需要的模型類添加了JsonIgnoreProperties。但是當通過休眠來檢索時需要時間。
在工作中,有set<Tasks>
。在任務中有JobsId
它試圖再次設置作業對象並通過循環。再次有set<Process>
,它映射到tasks
並通過循環。最後,當我在網頁瀏覽器中回覆結果爲JSON時,會出現錯誤。
我想要的是,當我檢索List<Jobs>
時,我想要任務,然後在任務內部,我不希望休眠狀態爲jobs
對象設置值。而且在Process
我不想爲tasks
對象設置。
我試着在每個註釋爲@ManyToOne
的字段中添加@Transient
(javax.persistence)。
但我得到以下錯誤
org.hibernate.AnnotationException: mappedBy reference an unknown target entity property
所有這些領域。
我該如何解決?
我想要的是
謝謝。傑克遜我正在使用1.8.4。夠了嗎?還是我需要更新?而且,如果我使用這個Mapper,我不需要使用@transient對嗎? – iCode
我認爲可以,但你最好測試一下。你不需要使用@Transient。我在我的項目中有這個實現,它工作正常。 – Mannekenpix
好的。謝謝。我會試試這個 – iCode