2014-01-31 83 views
0

我有一個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 

所有這些領域。

我該如何解決?

我想要的是

回答

0

我認爲你需要註冊Hibernate模塊的支持。 爲了做到這一點,創建一個自定義映射器。

Maven的依賴性

要在基於Maven的項目,使用以下依賴使用模塊:

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate4</artifactId> 
    <version>2.2.3</version> 
</dependency>  

然後,映射器

public class HibernateAwareObjectMapper extends ObjectMapper{ 

    public HibernateAwareObjectMapper(){ 
     registerModule(new Hibernate4Module()); 
    } 
} 

然後將其添加爲objectmapper使用

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <!-- Use the HibernateAware mapper instead of the default --> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="path.to.your.HibernateAwareObjectMapper" /> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

資源來自:https://github.com/FasterXML/jackson-datatype-hibernate

+0

謝謝。傑克遜我正在使用1.8.4。夠了嗎?還是我需要更新?而且,如果我使用這個Mapper,我不需要使用@transient對嗎? – iCode

+0

我認爲可以,但你最好測試一下。你不需要使用@Transient。我在我的項目中有這個實現,它工作正常。 – Mannekenpix

+0

好的。謝謝。我會試試這個 – iCode

0
@XmlTransient 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="TaskId") 
    public Tasks getTasks() { 
     return this.tasks; 
    } 

不應該這樣測繪與taskId。一個小T代替大寫,因爲你在Tasks表中的屬性名稱的關鍵是taskId

+0

在我的MySQL其他表中,它的'TaskId'。我們應該映射這個權利?而且它對我來說工作得很好。問題是隻有大量的數據。如果這很小,我會得到所有請求的錯誤 – iCode