我有以下数据库架构:
create table country (
id integer primary key
);
create table city (
id integer primary key,
country_id integer references country
);
和映射:
@Entity
class Country {
@Id private Integer id;
...
}
@Entity
class City {
@Id private Integer id;
@ManyToOne private Country country;
...
}
现在我有countryId
和cityId
。我需要更新表城并更改它的国家/地区。我会在SQL中做类似的事情:update city set country_id = :countryId where id = :cityId
。
我可以用类似语法的JPQL更新简单属性。但是如何在上面的例子中更新外键引用呢?
当然我可以通过id获取相应的实体并更新java实体,比如
City city = em.find(cityId, City.class);
Country country = em.find(countryId, Country.class);
city.setCountry(country);
但是此代码将发出2个不必要的选择。我想避免这种情况。
答案 0 :(得分:2)
我相信EntityManager.getReference()方法仅用于此目的。 见javadoc
答案 1 :(得分:1)
我找到了解决方案。这看起来很简单。只需创建新的实体对象,初始化其id并将其作为参数传递给JPQL更新查询:
Country country = new Country();
country.setId(countryId);
Query query = em.createQuery("update City set country = :country where id = :cityId");
query.setParameter("country", country);
query.setParameter("cityId", cityId);
query.executeUpdate();
显然,JPA不关心是从数据库检索country
对象还是手动创建,只需要设置id
属性。