2014-10-10 95 views
0

我有3个实体。 ClassA,ClassB和Class C. ClassA与ClassB和Class C有ManyToOne。Spring MVC:findById - 不包含所有ManyToOne集合

如果我从网络浏览器转到/classA/1/classA/abc/1,我得到了ClassA和ClassB和ClassC中所有项目的非常大的JSON。

但我只想ClassA和ClassB的id和ClassC的id。

我在哪里出错?

有被简化代码:

/* ------------------------------------------------------ */ 
@Entity 
@Table(name="CLASS_A") 
@NamedQuery(name="ClassA.findAll", query="SELECT c FROM ClassA c") 
public class ClassA implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(unique=true, nullable=false) 
    private int id; 

    @ManyToOne 
    @JoinColumn(name="class_b_id", nullable=false) 
    private ClassB classB; 

    @ManyToOne 
    @JoinColumn(name="class_c_id", nullable=false) 
    private ClassC classC; 

    @Lob 
    private String description; 

    public ClassA() { 
    } 
    // getters and setters... 

} 
/* ------------------------------------------------------ */ 
@Entity 
@Table(name = "CLASS_B") 
@NamedQuery(name = "ClassB.findAll", query = "SELECT c FROM ClassB c") 
public class ClassB implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(unique = true, nullable = false) 
    private int id; 

    @Lob 
    private String description; 

    @OneToMany(mappedBy = "classB") 
    private List<ClassA> classesA; 

    public ClassB() { 
    } 
    // getters and setters... 
} 
/* ------------------------------------------------------ */ 
Entity 
@Table(name = "CLASS_C") 
public class ClassC implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(unique = true, nullable = false) 
    private int id; 

    @Lob 
    private String description; 

    @OneToMany(mappedBy = "classC") 
    private List<ClassA> classesA; 

    public ClassC() { 
    } 
    // getters and setters... 
} 
/* ------------------------------------------------------ */ 
@Repository 
public class DaoClassA {  
    @Autowired 
    private SessionFactory sessionFactory; 

    public ClassA findById(int id) { 
     return (ClassA) this.sessionFactory.getCurrentSession(). 
       get(ClassA.class, id); 
    } 

    public ClassA findByIdMy(int id) { 
     return (ClassA) this.sessionFactory.getCurrentSession() 
       .createQuery("SELECT n FROM ClassA n LEFT JOIN FETCH n.classB LEFT JOIN FETCH n.classC WHERE n.id = :id").setInteger("id", id) 
       .uniqueResult(); 
    } 
} 
/* ------------------------------------------------------ */ 
@Controller 
@RequestMapping("/classA") 
public class RestController { 

    @Autowired 
    private ClassAmanager manager; 

    @RequestMapping(value="/{id}", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody ClassA get1(@PathVariable("id") int id) { 
     return manager.findById(id); 
    } 

    @RequestMapping(value="/abc/{id}", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody ClassA get2(@PathVariable("id") int id) { 
     return manager.findByIdMy(id); 
    } 
} 
/* ------------------------------------------------------ */ 

回答

0

一种解决方法这是相当常见的是映射ClassA实例某种数据转院对象(DTO),你然后从控制器返回的。

传输对象将包含来自ClassA的所有属性以及其关联的ClassBClassC实例的ID,而不是实例本身。

让我知道在评论,如果你需要一些代码示例演示这一点,我会更新的答案

更新,例如:通过这样

public class Foo { 
    private int id; 
    private Bar bar; 

    // Getters and setters 
} 

public class Bar { 
    private int id; 
    private String otherProperty1; 
    private String otherProperty2; 

    // Getters/setters 
} 

public class FooDto { 
    private int id; 
    private int barId; 

    // Getters and setters 
} 

public class FooMapper { 
    public static FooDto mapToDto(Foo foo) { 
     FooDto dto = new FooDto(); 
     dto.setId(foo.getId()); 
     dto.setBarId(foo.getBar().getId()); 
     return dto; 
    } 
} 

// Usage of the mapper in your controller method 
return FooMapper.mapToDto(foo); 

基本上你改变你的模型对象转换为传输对象,其中只有您想要在您序列化的JSON中看到的属性。

你不必像这样完全实现它。例如,如果您不想创建Mapper类,则可以将映射逻辑移至DTO对象的构造函数。

我希望这个例子给你的总体思路

+0

是的,例子会很好。 – martin 2014-10-10 16:01:24

相关问题