Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, update many-to-many / 1 сообщений из 1, страница 1 из 1
09.09.2012, 10:10:06
    #37949781
ukku
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate, update many-to-many
Добрый день. Есть две сущности, пользователи и диски:
Disk:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<hibernate-mapping>
	<class name="com.model.disk.Disk" table="DATA_DISK">
		<id column="ID" name="id" type="java.lang.Long">
			<generator class="increment"/>
		</id>
		<property column="NAME" name="name" type="java.lang.String"  not-null="true"/>
	</class>
</hibernate-mapping>


Пользователи:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<hibernate-mapping>
	<class name="com.model.user.User" table="DATA_USER">
		<id column="ID" name="id" type="java.lang.Long">
			<generator class="increment"/>
		</id>
		<properties name="UK_USER_NICNAME" unique="true">
			<property column="NICKNAME" name="nickname" type="java.lang.String" not-null="true"/>
		</properties>
		<property column="PASSWORD" name="password" type="java.lang.String"  not-null="true"/>
		<set name="diskId" table="REF_USER_DISK" cascade="all">
			<key column="USER_ID" />
			<many-to-many column="DISK_ID" unique="true" class="com.model.disk.Disk" />
		</set>
	</class>
</hibernate-mapping>



class User:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
package com.model.user;

import java.util.HashSet;
import java.util.Set;

import com.model.disk.*;

public class User 
{
//variable
	private long id;
	private String nickname;
	private	String password;
	private Set<Disk> diskId = new HashSet<Disk>(0);
//constructors	
	public User(){}
	public User(String nickname, String password)
	{
		this.nickname = nickname;
		this.password = password;
	}	
// setters
	public void setId(long id)
	{
		this.id = id;
	}
	public void setNickname(String nickname)
	{
		this.nickname = nickname;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public void setDiskId(Set<Disk> diskId)
	{
		this.diskId = diskId;
	}
// getters
	public long getId()
	{
		return this.id;
	}
	public String getNickname()
	{
		return this.nickname;
	}
	public String getpassword()
	{
		return this.password;
	}
	public Set<Disk> getDiskId()
	{
		return this.diskId;
	}
//
}


Пытаюсь создать юзера и после его создания добавить ему диски. Добавление дисков выделено жирным.
Вызов:
авторtry
{
User user = new User("root", "root");
Disk disk1 = new Disk("ABC");
Disk disk2 = new Disk("CBA");
System.out.println("add user: ");
UserAccess.addUser(user);
System.out.println("add disk: ");
DiskAccess.addDisk(disk1);
DiskAccess.addDisk(disk2);
System.out.println("add ref: ");
TakenItemAccess.takeDisk(user, disk1);
TakenItemAccess.takeDisk(user, disk2);


}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Смотри логи:
Hibernate logadd user:
Hibernate: select max(ID) from DATA_USER
new user id = 1
Hibernate: insert into DATA_USER (NICKNAME, PASSWORD, ID) values (?, ?, ?)
add disk:
Hibernate: select max(ID) from DATA_DISK
Hibernate: insert into DATA_DISK (NAME, ID) values (?, ?)
Hibernate: insert into DATA_DISK (NAME, ID) values (?, ?)
add ref:
Hibernate: update DATA_USER set NICKNAME=?, PASSWORD=? where ID=?
Hibernate: update DATA_DISK set NAME=? where ID=?
Hibernate: insert into REF_USER_DISK (USER_ID, DISK_ID) values (?, ?)
Hibernate: update DATA_USER set NICKNAME=?, PASSWORD=? where ID=?
Hibernate: update DATA_DISK set NAME=? where ID=?
Hibernate: update DATA_DISK set NAME=? where ID=?
Hibernate: insert into REF_USER_DISK (USER_ID, DISK_ID) values (?, ?)


Получается, чтобы добавить одну запись в связку пользователь-диск, Hibernate вначале делает кучу левых действий. Можно ли как-то его сказать, чтобы он инсертил только в одну табличку(REF_USER_DISK), а другие не трогал? А то чую не через то место делаю. Спасибо!
class TakenItemAccess:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
package com.model.takenItem;

import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;

import com.model.DatabaseUtil;
import com.model.user.User;
import com.model.disk.Disk;

public class TakenItemAccess 
{
	public static void takeDisk(User user, Disk disk) throws SQLException 
	{
		Session session = null;
		try 
		{
			session = DatabaseUtil.getSessionFactory().openSession();
			Transaction transaction = session.beginTransaction();
			user.getDiskId().add(disk);
			session.saveOrUpdate(user);
			transaction.commit();
		}
		catch (ConstraintViolationException e)
		{
			System.out.println(e.getCause());
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		} 
		finally 
		{
			if (session != null && session.isOpen()) 
				session.close();
		}
	}
}


...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate, update many-to-many / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]