спящий много-много каскадных отношений - PullRequest
4 голосов
/ 10 июня 2011

От новичка до гибернации. У меня есть две таблицы A и B, которые имеют отношения «многие ко многим», определяемые таблицей AB (A_ID и B_ID) со ссылкой внешнего ключа на A.A_ID и B.B_ID и каскадом при удалении и обновлении, определенным.

Я сопоставил

a.hbm.xml имеет

<set name="bSet" table="AB" inverse="true" lazy="false" fetch="select" cascade="all">
    <key>
        <column name="A_ID" not-null="true" />
    </key>
    <many-to-many class="objectB" >
        <column name="B_ID" not-null="true" />
    </many-to-many>
</set>

b.hbm.xml имеет

<set name="aSet" table="AB" inverse="false" lazy="false" fetch="select" cascade="all">
    <key>
        <column name="B_ID" not-null="true" />
    </key>
    <many-to-many class="objectA">
        <column name="A_ID" not-null="true" />
    </many-to-many>
</set>

//ObjectA.java has
private Set<ObjectB> bSet = new HashSet<objectB>(0);

//ObjectB.java has
private Set<ObjectA> aSet = new HashSet<objectA>(0);

С внешнего интерфейса отправляетОбъект в виде json с множеством таблиц B. Таблица A корректно обновляется, пока AB остается нетронутым.

Может кто-нибудь указать, где я ошибаюсь?Вот JSON

{
    "a_field1": "value1",
    "a_field2": "value2",
    "aId": 1,
    "bSet": [
        {
            "bId": 100
        },
        {
            "bId": 200
        }
   ],
    "a_field3": "value3"
}

, изначально в БД установлены 3 записи в таблице AB

(1,100) 
(1,200) 
(1,300)

Окончательные результаты в БД должны были быть

(1,100) 
(1,200) 

последняя строка (1300) должна быть удалена.

Любая помощь приветствуется.

  • Шах

1 Ответ

1 голос
/ 10 июня 2011

Мое лучшее предположение (вы не предоставили ни одного примера серверного кода, который обрабатывает запрос), заключается в том, что вы обновляете только одну сторону двунаправленной ассоциации.Другими словами, вы просто десериализуете этот экземпляр и выполняете слияние.Если вы получаете новый A, вам все равно нужно объединить экземпляр A, но вам также нужно загрузить все B, на которые A больше не ссылается, удалить экземпляр A из их списка, а также найти все B, на которые недавно ссылается Aи добавьте А в их список.Это одна из опасностей двунаправленных отношений в коде.

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