gpt4 book ai didi

java - 如何防止 Hibernate 在多对一映射中创建重复项

转载 作者:行者123 更新时间:2023-12-01 15:46:46 25 4
gpt4 key购买 nike

我有两个简单的对象;人和城市。一个城市可以有多个人,但一个人只能有一个城市。我希望能够保存一个人并让 Hibernate 自动保存城市 - 仅当它是一个新城市 - 即城市应该是唯一的。通过我的映射,我发现每次保存一个人时,都会在数据库中插入一个新的城市,无论它是否已经存在。我确信这是相当简单的,但是我是 Hibernate 的新手,并且正在努力解决它。请注意,如果我在一个 session 中保存两个具有单个城市的人 - 一切正常。这是跨 session 的问题。我还在 City 类中创建了 equals 和 hashcode 方法,如下所示。

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;

最佳答案

    if ( !(other instanceof Ward) ) return false;
final Ward that = (Ward) other;

这不应该是城市而不是沃德吗?

关于java - 如何防止 Hibernate 在多对一映射中创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com