Вставить в таблицу соединений в отношении многие ко многим - PullRequest
4 голосов
/ 13 июля 2011

Задача № 1:

У меня три таблицы;User, UserRole и UserRoleRelationships (таблица соединений).Таблица UserRole содержит все пользовательские роли, которые я хочу связать с пользователем.Когда я вставляю нового пользователя, я хочу добавить нового пользователя и добавить новую ассоциацию в таблицу соединений.Теперь, когда я запускаю запрос на вставку нового пользователя:

IWUser iwUser = new IWUser();

    iwUser.setUsername("username");
    iwUser.setFullName("fullName");
    iwUser.setEmail("email");
    iwUser.setPassword("password");
    iwUser.setPrivatephone("55555");
    iwUser.setWorkphone("777");


    Set<IWUserRole> roleList = new HashSet<IWUserRole>();
    IWUserRole iwUserRole = new IWUserRole();
    iwUserRole.setRole("ROLE_USER");
    roleList.add(iwUserRole);

    iwUser.setUserRole(roleList);
    iwUserManagementService.saveOrUpdate(iwUser);

hibernate выполняет следующие запросы:

Hibernate: insert into dbo.Users (Username, Password, Email, Workphone, Privatephone,  FullName) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into dbo.UserRoles (Role) values (?)
Hibernate: insert into UserRoleRelationships (UserId, RoleId) values (?, ?)

Мое отображение hibernate выглядит так:

IWUser.hbm.xml:

<hibernate-mapping>
<class name="domain.IWUser" schema="dbo" table="Users">
<id name="userId" type="int">
  <column name="UserId"/>
  <generator class="native"/>
</id>
<property name="username" type="string">
  <column name="Username" not-null="true"/>
</property>
<property name="password" type="string">
  <column name="Password" not-null="true"/>
</property>
<property name="email" type="string">
  <column name="Email" not-null="false"/>
</property>
<property name="workphone" type="string">
  <column name="Workphone" not-null="false"/>
</property>
<property name="privatephone" type="string">
  <column name="Privatephone" not-null="false"/>
</property>
<property name="fullName" type="string">
  <column name="FullName" not-null="false"/>
</property>
<set cascade="all" inverse="false" name="userRole" table="UserRoleRelationships" lazy="true" >
  <key>
    <column name="UserId"/>
  </key>
  <many-to-many class="domain.IWUserRole" column="RoleId"/>
</set>
</class>
</hibernate-mapping>

IWUserRole.hbm.xml:

<hibernate-mapping>
 <class name="domain.IWUserRole" schema="dbo" table="UserRoles">
 <id name="roleId" type="int">
  <column name="RoleId"/>
  <generator class="native"/>
 </id>
<property name="role" type="string">
  <column name="Role" not-null="true"/>
</property>
<set cascade="all" inverse="false" name="user" table="UserRoleRelationships" lazy="true">
  <key>
    <column name="RoleId"/>
  </key>
  <many-to-many class="domain.IWUser" column="UserId"/>
 </set>
 </class>
</hibernate-mapping>

Как получить спящий режим, чтобы сохранить нового пользователя с существующей ролью пользователя в объединительной таблице?

Задача № 2:

Когда я обновляю пользователя, hibernate удаляет связи в объединяемой таблице.Как я могу избежать этого?

1 Ответ

3 голосов
/ 13 июля 2011

Как перейти в спящий режим, чтобы сохранить нового пользователя с существующей ролью пользователя в объединяемой таблице?

Получите объект роли пользователя и поместите его в список вместо того, чтобы всегда создавать новый.

Я имею в виду эту часть:

IWUserRole iwUserRole = new IWUserRole();
iwUserRole.setRole("ROLE_USER");

Вместо этого вы бы отправили запрос типа select r from IWUserRole where r.role = 'ROLE_USER'

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