0

こんばんは。

私のxmlマッピングを見てください:

User.hbm.xml

特に と を見てinverse="false"ください<index column="EVENT_INDEX" /> :

<hibernate-mapping package="demidov.pkg.domain">
    <class name="TheUser" table="USER">
        <id name="userId" column="ID" type="integer">
            <generator class="native"/>         
        </id>

        <property name="userFirstName" column="FIRST_NAME" type="string" not-null="true"/>
        <property name="userLastName" column="LAST_NAME" type="string"/>
        <property name="userEmail" column="EMAIL" type="string" not-null="true"/>
        <property name="personAddress" column="PERSON_ADDRESS" type="string" />
        <property name="personPhoneNumber" column="PERSON_PHONE" type="string" />
        <property name="userGender" column="GENDER" type="string"/>

        <list name="userEventsList" inverse="false" lazy="true" fetch="select" cascade="all" >
            <key column="USER_ID" not-null="true" />
            <index column="EVENT_INDEX" />          
            <one-to-many class="UserEvents"/>       
        </list>
    </class>
</hibernate-mapping>

UserEvents.hbm.xml

特に見て <many-to-one name="theUser" class="TheUser" insert="false" update="false" lazy="false" fetch="select" cascade="save-update">

<hibernate-mapping package="demidov.pkg.domain">
    <class name="UserEvents" table="USER_EVENTS">
        <id name="userEventId" column="ID" type="integer">
            <generator class="native"/>
        </id>
        <property name="userEventDate" column="EVENT_DATE" type="date"/>
        <many-to-one name="theUser" class="TheUser" insert="false" update="false" lazy="false" fetch="select" cascade="save-update">
            <column name="USER_ID" not-null="true"/>
        </many-to-one>

        <joined-subclass name="ComputerMaintenanceEvent" table="MAINTENANCE_EVENT">
        <key column="MAINTENANCE_ID" not-null="true"/>
        <property name="descriptionMaintenance" column="DESCRIPTION_MAINTENANCE" type="string"/>
            <property name="additionalInfoMaintenance" column="ADDITIONAL_INFO_MAINTENANCE" type="string"/>
        </joined-subclass>              

        <joined-subclass name="SoftwareDevelopmentEvent" table="DEVELOPMENT_EVENT">
        <key column="DEVELOPMENT_ID" not-null="true"/>
        <property name="descriptionDevelopment" column="DESCRIPTION_DEVELOPMENT" type="string"/>
        <property name="additionalInfoDevelopment" column="ADDITIONAL_INFO_DEVELOPMENT" type="string"/>
        </joined-subclass>
    </class>
</hibernate-mapping>

したがって、私のUser.hbm.xmlisinverse="false"とmy UserEvents.hbm.xmlisでは、insert="false" update="false"ユーザー + ユーザーイベントをデータベースに保存したいときに<index column="EVENT_INDEX/>更新され、コレクションの要素 (0、1、2 など) をカウントするインデックスが作成されます。このような:

+----+------------+---------+-------------+----------------+-------------------------+-----------------------------+
| ID | EVENT_DATE | USER_ID | EVENT_INDEX | MAINTENANCE_ID | DESCRIPTION_MAINTENANCE | ADDITIONAL_INFO_MAINTENANCE |
+----+------------+---------+-------------+----------------+-------------------------+-----------------------------+
|  1 | 2013-10-31 |       1 |           0 |              2 | Description maitnance   |  Maitnance Test             |
|  2 | 2013-10-31 |       1 |           1 |              2 | Description maitnance   |  Maitnance Test             |
+----+------------+---------+-------------+----------------+-------------------------+-----------------------------+

しかし、私が自分の中にあり、私の中にUser.hbm.xmlありinverse="true"UserEvents.hbm.xmlユーザーinsert="true" update="true"+ ユーザーイベントをデータベースに保存したい場合、データベースには、挿入されたコレクションの各要素の値<index column="EVENT_INDEX/>があります。nullこのような:

+----+------------+---------+-------------+----------------+-------------------------+-----------------------------+
| ID | EVENT_DATE | USER_ID | EVENT_INDEX | DEVELOPMENT_ID | DESCRIPTION_DEVELOPMENT | ADDITIONAL_INFO_DEVELOPMENT |
+----+------------+---------+-------------+----------------+-------------------------+-----------------------------+
|  1 | 2013-10-31 |       1 |        NULL |              1 | Develop                 | Development Test            |
|  2 | 2013-10-31 |       1 |        NULL |              1 | Develop                 | Development Test            |
+----+------------+---------+-------------+----------------+-------------------------+-----------------------------+

そして、なぜ私の休止状態が、コレクション要素に含まれる同じ値を何回も挿入コピーするのかという別の問題。テーブルからわかるように、DBに1つのDESCRIPTION_DEVELOPMENTオブジェクトと1つのDESCRIPTION_MAINTENANCEオブジェクトを保存しようとしています->それらは1つのコレクションにありますが、同じコレクションに2つの異なる要素があるため、休止状態で2回保存します。

挿入方法:

List<UserEvents> eventList  = new ArrayList<UserEvents>();

SoftwareDevelopmentEvent sde = new SoftwareDevelopmentEvent();
sde.setDescriptionDevelopment("Develop");
sde.setAdditionalInfoDevelopment("Development Test");
sde.setUserEventDate(new Date());
eventList.add(sde);

ComputerMaintenanceEvent cme = new ComputerMaintenanceEvent();
cme.setDescriptionMaintenance("Description maitnance");
cme.setAdditionalInfoMaintenance(" Maitnance Test");
cme.setUserEventDate(new Date());
eventList.add(cme);

TheUser user = new TheUser();
user.setUserFirstName("Vadim1");
user.setUserLastName("Dem1");
user.setUserGender("Male1");
user.setUserEmail("vad@mail.ru");
user.setPersonAddress("Adress");
user.setPersonPhoneNumber("1111111");

user.setUserEventsList(eventList);

dao.saveUser(user);

DAO メソッドは単純です。

public void saveUser(TheUser user) {
    Session session = sessionFactory.getCurrentSession();
    session.save(user);
}
4

1 に答える 1

0

こちらの私の投稿をご覧ください。

Java - Hibernate @ManyToMany マッピングは、データベースにレコードを一方向にのみ追加します

関係の両側を設定する必要があります。

例 cme.setUser(user);

アラン

于 2013-10-31T13:08:45.163 に答える