У меня есть два простых объекта; Человек и Город. Город может иметь несколько человек, но только один город. Я хотел бы иметь возможность сохранить Персона и сделать так, чтобы Hibernate автоматически сохранял Город - только если это новый Город - то есть города должны быть уникальными. С моим отображением я обнаружил, что каждый раз, когда Персона сохраняется, в базу данных вставляется новый Город, независимо от того, существует ли он уже там. Я уверен, что это довольно просто, однако я новичок в Hibernate и борюсь с этим. Обратите внимание, если я сохраню два человека с одним городом в одном сеансе - все работает. Это проблема между сессиями. Я также создал методы equals и hashcode в классе City, как показано ниже.
Person.hbm.xml
<id name="id" type="long" column="id" >
<generator class="native"/>
</id>
<property name="firstName">
<column name="firstname" />
</property>
<many-to-one name="city" class="com.project.City" cascade="save-update">
<column name="cityId" not-null="true" />
</many-to-one>
City.hbm.xml
<id name="id" type="long" column="id" >
<generator class="native"/>
</id>
<property name="description" unique="true">
<column name="description" />
</property>
public class City implements java.io.Serializable {
private Long id;
private String description;
// getters and setters
public boolean equals(Object other) {
if (this==other) return true;
if ( !(other instanceof City) ) return false;
final City that = (City) other;
return this.description.equals( that.getDescription() );
}
public int hashCode() {
return description.hashCode();
}
}
try {
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(City.class);
criteria.add(Restrictions.eq("description", city.getDescription()));
criteria.setMaxResults(1);
// Possible to use:
// List<City> cities = criteria.list();
// However, this generates warnings about unsafe casting. If you use this then
// set @SuppressWarnings("unchecked")
List<City> cities = HibernateUtil.castList(City.class, criteria.list());
if (cities.isEmpty()) {
session.save(city);
}
else {
city = (City) cities.get(0);
}
session.flush();
tx.commit();
}
catch (Exception e) {
return null;
}
}
return city;