Как предотвратить создание дубликатов в Hibernate во многих сопоставлениях - PullRequest
0 голосов
/ 03 августа 2011

У меня есть два простых объекта; Человек и Город. Город может иметь несколько человек, но только один город. Я хотел бы иметь возможность сохранить Персона и сделать так, чтобы 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;

1 Ответ

1 голос
/ 03 августа 2011
    if ( !(other instanceof Ward) ) return false;
    final Ward that = (Ward) other;

Разве это не город вместо Уорда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...