14.07.2012, 15:09. Показов 2921. Ответов 3
Здравствуйте! Я пишу программу, где используется Hibernate. У меня есть пять персистентных классов, реализующих таблицы:
1) Это класс Post (Список Должностей)
| 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
| import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Post {
@Id
@GeneratedValue
@Column(name="post_id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="post_name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(targetEntity=EmployeeHistory.class,mappedBy="post",
cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public List<EmployeeHistory> getEmployeeHistories() {
return employeeHistories;
}
public void setEmployeeHistories(List<EmployeeHistory> employeeHistories) {
this.employeeHistories = employeeHistories;
}
private int id;
private String name;
List<EmployeeHistory> employeeHistories;
} |
|
2) Класс Person (Список людей)
| 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
58
59
60
61
62
63
64
65
| import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Person {
@Id
@GeneratedValue
@Column(name="person_id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="person_name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="person_lost_name")
public String getLostName() {
return lostName;
}
public void setLostName(String lostName) {
this.lostName = lostName;
}
public String getPatronym() {
return patronym;
}
public void setPatronym(String patronym) {
this.patronym = patronym;
}
@OneToMany(targetEntity=EmployeeHistory.class,mappedBy="person",
cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public List<EmployeeHistory> getEmployeeHistories() {
return employeeHistories;
}
public void setEmployeeHistories(List<EmployeeHistory> employeeHistories) {
this.employeeHistories = employeeHistories;
}
private int id; //первичный ключ
private String name, //имя
lostName, //фамилия
patronym; //отчество
List<EmployeeHistory> employeeHistories;
} |
|
3) Класс Division (список подразделений компании)
| 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
| import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Division {
@Id
@GeneratedValue
@Column(name="div_id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="div_name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(targetEntity=DivHistory.class,mappedBy="division",
cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public List<EmployeeHistory> getEmployeeHistories() {
return employeeHistories;
}
public void setEmployeeHistories(List<EmployeeHistory> employeeHistories) {
this.employeeHistories = employeeHistories;
}
@OneToMany(targetEntity=DivHistory.class,mappedBy="division",
cascade=CascadeType.ALL,fetch=FetchType.EAGER)
public List<DivHistory> getDivHistories() {
return divHistories;
}
public void setDivHistories(List<DivHistory> divHistories) {
this.divHistories = divHistories;
}
private int id; //певичный ключ
private String name; //имя
List<EmployeeHistory> employeeHistories; //записи о работниках
List<DivHistory> divHistories; //записи о подразделениях
} |
|
4) В классе EmployeeHistory хранится информация о том, когда (какого числа) какой сотрудник получил такую-то должность или когда перешёл в такое-то подразделение. Иными словами, записывает все изменения связанные с сотрудниками.
| 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
58
59
60
61
62
63
64
65
66
| import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="employee_history")
public class EmployeeHistory {
@Id
@GeneratedValue
@Column(name="emp_history_id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="emp_date")
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@ManyToOne
@JoinColumn(name="person_id")
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@ManyToOne
@JoinColumn(name="post_id")
public Post getPost() {
return post;
}
public void setPost(Post post) {
this.post = post;
}
@ManyToOne
@JoinColumn(name="div_id")
public Division getDivision() {
return division;
}
public void setDivision(Division division) {
this.division = division;
}
private int id;//emp_change_id
Date date;//div_date
private Person person;
private Post post;
private Division division;
} |
|
5) В классе DivHistory хранится когда подразделение id стало входить в подразделение fathId (father id)
| 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
58
59
60
| import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="div_hisory")
public class DivHistory {
@Id
@GeneratedValue
@Column(name="div_change_id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="father_div_id")
public int getFathId() {
return fathId;
}
public void setFathId(int fathId) {
this.fathId = fathId;
}
@Column(name="div_date")
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@ManyToOne
@JoinColumn(name="div_id")
public Division getDivision() {
return division;
}
public void setDivision(Division division) {
this.division = division;
}
private int id,//div_change_id
fathId;//father_div_id
Date date;//div_date
Division division;
} |
|
И есть ещё класс DBManager, управляющий всем этим.
| 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class DBManager {
public DBManager() {
config=new Configuration();
config.addAnnotatedClass(DivHistory.class);
config.addAnnotatedClass(Division.class);
config.addAnnotatedClass(EmployeeHistory.class);
config.addAnnotatedClass(Person.class);
config.addAnnotatedClass(Post.class);
config.configure(constConfig);
//new SchemaExport(config).create(true, true);
// SessionFactory factory=config.buildSessionFactory();
// session=factory.getCurrentSession();
}
public Session getCurrentSession()
{
SessionFactory factory=config.buildSessionFactory();
return factory.getCurrentSession();
}
public void init()
{
new SchemaExport(config).create(true, true);
}
public void addPerson(Person person,Post post,Division division)
{
Session session=this.getCurrentSession();
session.beginTransaction();//начало транзакции
EmployeeHistory eh=new EmployeeHistory();
eh.setPerson(person);
eh.setPost(post);
eh.setDivision(division);
session.save(eh);
session.save(person);
session.getTransaction().commit();
}
public void addEmployee(String name,String surname, String patronym,
String post, String division)
{
}
public void addDivision(Division division, int fathId)
{
Session session=this.getCurrentSession();
session.beginTransaction();//начало транзакции
DivHistory dh=new DivHistory();
dh.setDivision(division);
dh.setFathId(fathId);
session.save(dh);
session.save(division);
session.getTransaction().commit();
}
public void addPost(Post post)
{
Session session=this.getCurrentSession();
session.beginTransaction();//начало транзакции
session.save(post);
session.getTransaction().commit();
}
public static void main(String[] args)
{
DBManager manager=new DBManager();
manager.init();
Post post=new Post();
post.setName("Administrator");
manager.addPost(post);
// Division div=new Division();
// manager.addDivision(div, 13);
// Person person=new Person();
// person.setName("Nikolay");
// person.setLostName("Stavrogin");
// person.setPatronym("Vselodovich");
// manager.addPerson(person, post, div);
}
Configuration config;
private final static String constConfig="hibernate.cfg.xml";
} |
|
Все действия описаны в методе main() класса DBManager.
Все таблицы благополучно создаются, код конструктора класса и метод init() работаю без ошибок. Но при попытке добавить новую запись возникает ошибка "
cannot simultaneously fetch multiple bags".
Трассировка ошибки, выглядит следующим образом:
Exception in thread "main" org.hibernate.loader.MultipleBagFetchExc eption: cannot simultaneously fetch multiple bags
at org.hibernate.loader.BasicLoader.postIns tantiate(BasicLoader.java:94)
at org.hibernate.loader.entity.EntityLoader .<init>(EntityLoader.java:119)
at org.hibernate.loader.entity.EntityLoader .<init>(EntityLoader.java:71)
at org.hibernate.loader.entity.EntityLoader .<init>(EntityLoader.java:54)
at org.hibernate.loader.entity.BatchingEnti tyLoader.createBatchingEntityLoader(Batc hingEntityLoader.java:133)
at org.hibernate.persister.entity.AbstractE ntityPersister.createEntityLoader(Abstra ctEntityPersister.java:1914)
at org.hibernate.persister.entity.AbstractE ntityPersister.createEntityLoader(Abstra ctEntityPersister.java:1937)
at org.hibernate.persister.entity.AbstractE ntityPersister.createLoaders(AbstractEnt ityPersister.java:3206)
at org.hibernate.persister.entity.AbstractE ntityPersister.postInstantiate(AbstractE ntityPersister.java:3192)
at org.hibernate.persister.entity.SingleTab leEntityPersister.postInstantiate(Single TableEntityPersister.java:728)
at org.hibernate.impl.SessionFactoryImpl.<i nit>(SessionFactoryImpl.java:348)
at org.hibernate.cfg.Configuration.buildSes sionFactory(Configuration.java:1872)
at com.java.summwork.dbwork.DBManager.getCu rrentSession(DBManager.java:27)
at com.java.summwork.dbwork.DBManager.addPo st(DBManager.java:76)
at com.java.summwork.dbwork.DBManager.main( DBManager.java:90)
|
У меня есть подозрения, что это связано с моими попытками маппинга @OneToMany в классе EmployeeHistory, но может это и не так.
В чём может быть эта ошибка? Есть ли способ её как-дибо разрешить?