如何强制Hibernate使用 ManyToOne 关系中的其他对象加载我的主对象?这是设置其他值的时刻,而不是@Id
属性。
你可以在github上用maven项目查看我的repo,HbnAddressDaoTest是一个JUnit测试类,我试试这个行为
Address
是我想要保留到数据库的实体类,但只有Country
的国家/地区代码。 Country
表中的所有行都是常量,因此不应再次插入Country
个对象,只需要编写countryId
。 Hibernate中是否有任何自动化机制,或者我必须在Country
持久性之前在某些服务事务方法中手动加载Address
吗?
答案 0 :(得分:1)
不,它不可行,java无法知道new Country("BE")
何时等于countryDao.getByCode("BE")
,因为,不存在等号,一个由Hibernate管理,另一个由Hibernate管理由你管理。
你没有将new Country("BE")
提供给Hibernate,所以它不能相同,你调用new Countru("BE")
,code
为空,并且countryDao.getByCode("BE")
的代码不为空(它是由您的SQL脚本创建的,现在由Hibernate管理)。
您有两种选择:
将测试更改为:
Country country = countryDao.getByCode("BE");
Address address = new Address();
address.setCountry(country);
addressDao.create(address);
assertEquals(country.getCountryId(), addressDao.get(address.getAddressId()).getCountry().getCountryId());
测试地址是否已正确保留,或者:
像这样创建CountryProvider
:
public class CountryProvider {
@Autowired HbnCountryDao dao;
Map<String, Country> map = new HashMap<String, Country>();
public Country getByCode(String code) {
if (map.contains(code)) return map.get(code);
Country toRet = dao.getByCode(code);
map.put(code, toRet);
return toRet;
}
}
将您的所有Country
构造函数设为私有或受保护,并且只能通过Country
访问CountryProvider
。