控制spring + hibernate

时间:2015-11-15 18:43:28

标签: java spring hibernate

我想知道@Autowire究竟如何运作的问题。我目前的问题是数据模型中基于对象的关系:

假设存在多对一关系,在模型中定义了两种方式:

@Entity
@Table(name = "Company")
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id", nullable = false)
    private Integer id;

    @Column(name = "Code", nullable = false)
    private String code;

    @Column(name = "Name", nullable = false)
    private String name;

    ...


    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "CountryCodeA3")
    private Country country;

    ...


@Entity
@Table(name = "Country")
public class Country {
    @Column(name = "CodeA2", nullable = false)
    private String codeA2;

    @Id
    @Column(name = "CodeA3", nullable = false)
    private String codeA3;

    @Column(name = "CodeNum", nullable = false)
    private String codeNum;

    @Column(name = "Name", nullable = false)
    private String name;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "country")
    private Set<Company> companies;

    ...

然后我声明一些标准的DAO来访问这两个对象,最后是控制器(这里只是相关的函数):

@ApiOperation(value = "List of all companies", notes = "List of all companies for our system.", response = Company[].class)
@ApiResponses(value = { @ApiResponse(code = HttpServletResponse.SC_OK, message = "OK") })
@RequestMapping(value = obj_names_api, method =  RequestMethod.GET)
public ResponseEntity<SmartHttpResult> companyGetAll() {
    final List<Company> list = dao.findAll();

    return Response.getHttpResult(list, list.size() > 0, "/", "COMPANY_NOT_FOUND");
}

这会很好地序列化我的CountryCompany对象,将结构良好的JSON对象返回给客户端。它会遍历所有关系并获取适当的对象。

示例返回对象:

{
  "id": 0,
  "code": "string",
  "name": "string",
  "country": {
    "codeA2": "string",
    "codeA3": "string",
    "name": "string"
  }
}      

这也不是我想要的。

我想要的是使用Java中的对象并仅为Company.countryCodeA3序列化FK字段值之类的简单事物。我也不需要整个反向关系数组来到客户端,除非我明确告诉它去那里(通过一个单独的函数)。我不知道如何创建公司并指定该公司所在的国家/地区(未实际将整个国家/地区对象添加到POSTed公司)。

我知道如何编写函数来实际检索关系。我不知道(这就是问题)是如何告诉他们在序列化一个特定对象时不要深入。我只想发送国家ID来告诉该公司所属的国家/地区 - 如果是多对多关系,请列出ID。

那么,我可以告诉Spring + Hibernate仅序列化简单对象并仅通过单独的函数提供对象关系吗?

1 个答案:

答案 0 :(得分:0)

存在很多方法,其中一种方法是使用@JSON注释。使用此注释,您可以控制应序列化/反序列化的字段。

JSON注释可用于将对象中的字段标记为默认包含。注释可以放在方法或字段上。一个很好的例子可能是包含对Zipcode对象的引用的Address对象。由于Zipcode是每个地址(在美国)中不可或缺的一部分,因此我们可能更有意义地使用注释来默认它。所以在我们的Address对象中,我们可以执行以下操作:

 public class Address { 
   private String name; 
   private String street; 
   private String city; 
   private String state; 
   private Zipcode zipcode; 

   @JSON 
   public Zipcode getZipcode() { } 
}

注释可以提高您的安全性,以便不应该通过线路发送的字段可以固定在一个地方。这样,您可以使代码更加DRY,从而防止意外的安全漏洞。考虑我们是否在我们的User对象中存储密码的哈希版本。

public class User { 
  private String login; 
  private String hashedPassword; 
  private Date lastLogin; 

  @JSON(include=false) 
  public String getHashedPassword() { } 
}