отображение внешнего ключа гибернации многие-к-одному - PullRequest
2 голосов
/ 24 марта 2010

Я давно над этим работаю, но все еще не могу понять, что не так с моим кодом. Каждый сервис имеет несколько профилей, но каждый профиль имеет только один сервис.

Service
{
Long service_id; // primary key
... getter/setter
}

Profile
{
Long profile_id; // primary key
Long service_id; // foreign key
... getter and setter
}

в Profile.hbm.xml. Я добавляю

< many-to-one name="service_id" class="com.mot.diva.dto.Service" column="SERVICE_ID" cascade="save-update">
< /many-to-one>

Это правильный способ отобразить это?

1 Ответ

10 голосов
/ 24 марта 2010

Каждый сервис имеет несколько профилей, но каждый профиль имеет только один сервис.

Затем спроектируйте свою объектную модель соответственно. При использовании инструмента ORM вам нужно думать об объекте (сущностях) и отношениях между сущностями, а не идентификаторами. ORM позаботится о PK, FK, объединениях и т. Д. Поэтому ваш код должен выглядеть примерно так:

public class Service implements Serializable {
    private Long service_id; // primary key
    private Set<Profile> profiles = new HashSet<Profile>();

    // ... getter/setter
}

public class Profile implements Serializable {
    private Long profile_id; // primary key
    private Service service;

    // ... getter and setter
}

И файл сопоставления Profile.hbm.xml:

....
<many-to-one name="service" 
             class="com.mot.diva.dto.Service"
             column="SERVICE_ID"
             cascade="save-update">
</many-to-one>
...

И в Service.hbm.xml (потому что ваша ассоциация кажется двунаправленной):

...
<set name="profiles" inverse="true">
    <key column="PROFILE_ID" not-null="true"/>
    <one-to-many class="com.mot.diva.dto.Profile"/>
</set>
...
...