2

让我们以这两个实体为例:

城市 :

<class name="City" table="city">
    <id name="id" column="id"/>
    <property name="city_name" column="city_name"/>
    <property name="country_name" column="country_name"/>
</class>

人 :

<class name="Person" table="person">
    <id name="id" column="id"/>
    <property name="name" column="name"/>    
    <many-to-one cascade="save-update" name="city" column="city_id" class="City"/>
</class>

City.equals()true如果两者city_namecoutry_name相同,则实现返回。

如果我Person在一个会话中保存两个:

Person person1 = new Person("Peter");
Person person2 = new Person("John");

City city1 = new City("Paris", "France");
City city2 = new City("Paris", "France");

person1.setCity(city1);    
person2.setCity(city2);

session.save(person1);
session.save(person2);

Hibernate 会产生以下记录:

城市 :

| id |  name  | city_id |
-------------------------
| 1  |  Peter |    1    |
| 2  |  John  |    2    |

人 :

| id |  city_name | country_name |
----------------------------------
| 1  |    Paris   |    France    |
| 2  |    Paris   |    France    |

但是我可以告诉 Hibernatecity_idperson什么时候重用它cityX.equals(cityY)吗?

编辑 :

我应该澄清city1不能与city2. 为简洁起见,我无法描述我面临的全部问题。在实际情况下,表格可以包含重复元素,我只是想通过对一些特定元素进行分组来节省一些空间。谢谢!

4

5 回答 5

0

尝试这个:

Person person1 = new Person("Peter");
Person person2 = new Person("John");

City city1 = new City("Paris", "France");

person1.setCity(city1);    
session.save(person1);
person2.setCity(city1);
session.save(person2);
于 2013-07-08T16:30:34.700 回答
0

也许您有不同的想法,但这是我的处理方式:

  1. 首先,我会在城市表的以下字段上放置一个唯一索引(city_name,country_name)
  2. 当然我会让 Hibernate 知道这个唯一索引
  3. 而不是City city1 = new City("Paris", "France")我会

    //use session.createQuery or createCriteria here  
    City city = findByNameAndCountry("Paris", "France")   
    if (city == null){  
        city = new City("Paris", "France");  
        session.save(city)  
    }  
    
于 2013-07-08T16:31:06.000 回答
0

创建一个City对象并将相同的对象分配给两个实体。您需要先保留此City对象,以便与现有对象建立关联。

这里有一个问题。

由于您为两个Person实例分配了相同的值,因此实际上不应完成级联,但City如果在删除Person.

在您的特定情况下,由于您正在处理城市,因此包含许多城市的现有表可能是一个不错的选择,允许您将预先存在的城市分配给新人,以防您想PersonParis删除彼得后创建第三个和约翰

于 2013-07-08T16:28:15.650 回答
0

城市是一个实体,它的平等取决于它的身份。只要您将两个不同的城市与两个人相关联,您就会得到两个人。

为避免这种情况,您必须仅在城市对象不存在时创建它,否则使用已经存在的城市对象。

还有一个问题:如果同一个国家的两个城市碰巧同名怎么办?他们不会是同一个城市,但会拥有相同的身份。

于 2014-07-01T19:51:18.190 回答
0

最好以 city_name 和 country_name 作为主键。所以在这种情况下,您不能将相同的值插入数据库。喜欢..

City city1 = new City("Paris", "France");
City city2 = new City("Paris", "France");

因此,您必须拥有一个具有相同值的城市对象。然后它不会重复。

不要忘记根据 equals() 方法重写 hashCode()。

于 2013-07-08T16:52:42.823 回答