Hibernate @ManyToOne映射 - 没有@Id属性设置的自动加载

时间:2014-08-27 20:02:24

标签: java spring hibernate jpa orm

如何强制Hibernate使用 ManyToOne 关系中的其他对象加载我的主对象?这是设置其他值的时刻,而不是@Id属性。

你可以在github上用maven项目查看我的repo,HbnAddressDaoTest是一个JUnit测试类,我试试这个行为

Address是我想要保留到数据库的实体类,但只有Country的国家/地区代码。 Country表中的所有行都是常量,因此不应再次插入Country个对象,只需要编写countryId。 Hibernate中是否有任何自动化机制,或者我必须在Country持久性之前在某些服务事务方法中手动加载Address吗?

1 个答案:

答案 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