Каскадная проблема Java Hibernate - PullRequest
3 голосов
/ 17 ноября 2011

---- Вводная информация и проблемная область ----


В основном у меня есть 3 таблицы в базе данных: «Пользователь», «Элемент», «ItemsPerUser».

Пользователь таблицы:

имя пользователя (PK);пароль;электронная почта

Элемент таблицы

name (PK)

Table ItemsPerUser

username (PK) (и FK);item_name (PK) (и FK)

Когда я не использую каскадирование, я получаю error : «Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется».

Файлы сопоставления правильные.Мне нужен какой-то каскадный .Это работает, когда я добавляю каскад в свойстве set отношения многие-ко-многим , чтобы добавить несуществующие данные в User & Item, но перезаписывает данные в ItemsPerUser .Всякий раз, когда я сохраняю объект, содержащий один или несколько элементов, которые уже были введены в ItemsPerUser , он перезаписывает строку, даже если другая часть ПК не является тем же пользователем.Таким образом, в основном предыдущий пользователь с этим «элементом» перезаписывается новым пользователем с таким же элементом.Всегда следует добавлять новую строку в таблицу ItemsPerUser , если это новый пользователь, даже с одним или несколькими элементами, которые уже введены другим объектом User.

-- Пример в визуальном стиле ----


Предположим, я начинаю с пустой базы данных и вставляю нового пользователя Roger, у которого есть два элемента: кофе и вода.Вот пример того, что происходит (Hibernate обрабатывает это правильно):

User             ItemsPerUser               Item  
Roger            Roger-coffee               coffee  
                 Roger-water                water  

Теперь, когда я вставляю нового пользователя "Alfonzo", у которого есть кофе и сода, это происходит:

User             ItemsPerUser               Item  
Roger            Alfonzo-coffee             coffee  
Alfonzo          Roger-water                water  
                 Alfonzo-soda               soda  

---- Пример (ы) кода ----


//Mapping for databag 'User' - !! NOTE: I have deleted the cascade rule in the XML
<hibernate-mapping>
    <class name="databag.User" table="User" catalog="androiddb">
        <id name="username" type="string">
            <column name="username" length="45" />
            <generator class="assigned" />
        </id>
        <property name="password" type="string">
            <column name="password" length="45" not-null="true" />
        </property>
        <property name="email" type="string">
            <column name="email" length="45" not-null="true" unique="true" />
        </property>
        <set name="items" inverse="false" table="itemsperuser">
            <key>
                <column name="username" length="45" not-null="true" />
            </key>
            <many-to-many entity-name="databag.Items">
                <column name="item_name" length="45" not-null="true"/>
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

//Mapping for Item
<hibernate-mapping>
    <class name="databag.Item" table="item" catalog="androiddb">
        <id name="name" type="string">
            <column name="name" length="45" />
            <generator class="assigned" />
        </id>
        <set name="users" inverse="false" table="itemsperuser">
            <key>
                <column name="item_naam" length="45" not-null="true" />
            </key>
            <many-to-many entity-name="databag.User">
                <column name="username" length="45" not-null="true" />
            </many-to-many>
        </set>
    </class>
</hibernate-mapping>

//Saving an object
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction trans = session.beginTransaction();
session.save((User)o);
trans.commit();
session.close();

Примечание: '(Пользователь) o' не содержит ни одного, ни одного, ни нескольких элементов.

1 Ответ

1 голос
/ 12 декабря 2011

Вы не можете установить обратное = "ложь" с обеих сторон. Hibernate не может сохранять оба набора (пользователи в Item и элементы в User) в одной и той же таблице, если только один из них не называется «обратным», и его можно безопасно игнорировать для записи. Заполняется только при чтении.

Я бы установил inverse = "true" на стороне элемента.

Затем вам нужно сначала сохранить элементы, затем добавить их пользователю, а затем сохранить пользователя.

...