гибернация отображения внешнего ключа много-к-одному


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

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

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

В Профиль.hbm.XML. Я добавляю

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

Является ли это правильным способом отображения?

1 2

1 ответ:

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

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

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>
...