2012-10-04 43 views
3

我正在创建RESTful Web服务。客户端可以注册Company,然后根据需要进行更新。 CompanyAddress协会。当用户请求Company更新它发送Company对象ID和Company涉及Address对象没有Address es id。要更新Company对象,我使用hibernate merge方法。它会正确设置新的Company数据,但会创建新的行而不是更新它。更新休眠关联

我该如何解决这个问题?

我可售Address通过company.getAddress()得到它的ID和合并新Address但是当我这样做,所有Company数据正在牵强,我认为这是不好的。

public class Company implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "address_id") 
    private Address address; 
} 

UPDATE

我也可以写一个自定义查询

UPDATE address SET city='NEW YORK' FROM companies WHERE address.id = companies.address_id 

,但我想这是一个默认的动作。如果您看到没有ID的任何关联,请使用上述查询。

+0

当你合并一家公司时,所有的公司数据也被提取。不要预先优化。让它工作,如果你有一个性能问题,看看它来自哪里,并优化这部分。通过ID获取公司及其地址非常快。 –

回答

0

我不太清楚你为什么使用合并而不是直接更新请求的地址对象。

例如。 (伪)

Company c = (Company)query.findbyid(id) 
Address a = c.getAddress() 

a.setField1(field1); 
a.setField2(field2); 
a.setField3(field3); 

pm.commit(c); 

两件事你需要检查,如果您正在使用合并技术设置: 1.地址关联是延迟加载,这意味着,直到你要求它为null。难道你是从PersistenceManager分离公司对象,然后尝试合并?

  1. 此外,我假设你的地址也是一个实体。它会产生id(主键)。确保你不会搞砸了。如果它重新生成一个新的ID,你会得到另一个行。