Java 具有附加属性且不将多对多映射为单独实体的多对多
下面的例子很好用,hovewer我想让你检查一下这是否是一个好方法,因为我以前没有这样的要求,我很好奇应该怎么做 我有三个表:EMPLOYEE、MEETING、EMPLOYEE_MEETING,对于员工和会议之间的多对多关系,只有两个映射。似乎我能够插入、加载和更新所有内容。我想要实现的不是为关系创建额外的映射、DAO和单独的模型Java 具有附加属性且不将多对多映射为单独实体的多对多,java,hibernate,Java,Hibernate,下面的例子很好用,hovewer我想让你检查一下这是否是一个好方法,因为我以前没有这样的要求,我很好奇应该怎么做 我有三个表:EMPLOYEE、MEETING、EMPLOYEE_MEETING,对于员工和会议之间的多对多关系,只有两个映射。似乎我能够插入、加载和更新所有内容。我想要实现的不是为关系创建额外的映射、DAO和单独的模型 CREATE TABLE "employee_meeting" ( "employee_id" bigint(20) NOT NULL, "meeting_i
CREATE TABLE "employee_meeting" (
"employee_id" bigint(20) NOT NULL,
"meeting_id" bigint(20) NOT NULL,
"opinion" varchar(50) DEFAULT NULL,
PRIMARY KEY ("employee_id","meeting_id"),
KEY "FK_MEETING" ("meeting_id"),
CONSTRAINT "FK_EMPLOYEE" FOREIGN KEY ("employee_id") REFERENCES "employee" ("employee_id"),
CONSTRAINT "FK_MEETING" FOREIGN KEY ("meeting_id") REFERENCES "meeting" ("meeting_id")
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
<hibernate-mapping package="net.viralpatel.hibernate">
<class name="Employee" table="EMPLOYEE">
<id name="employeeId" column="EMPLOYEE_ID">
<generator class="native" />
</id>
<property name="firstname" />
<property name="lastname" column="lastname" />
<set name="meetings" table="EMPLOYEE_MEETING" inverse="false" lazy="false" fetch="select" cascade="all" >
<key column="EMPLOYEE_ID" />
<composite-element class="EmployeeMeeting">
<parent name="employee" />
<many-to-one name="meeting" column="MEETING_ID" not-null="true" cascade="all"
class="Meeting" />
<property name="opinion" column="OPINION" />
</composite-element>
</set>
</class>
以这种方式将Manty减少到多个集合,而无需双向,就等于一个集合 我建议尊重多对多集合,在
Meeting
下创建Employee
的数组并定义双向映射
hibernate的版本是什么?从会议课上,我不需要接触员工。。我只需要从员工级别访问会议-让员工我需要插入、更新、删除会议 我做了一些测试,它似乎起作用了。奇怪的是,当我运行此代码时,我只是从数据库加载数据:
Employee e2 = (Employee) session.load(Employee.class, new Long(18));
Employee e = (Employee) session.load(Employee.class, new Long(17));
Iterator i = e.getMeetings().iterator();
while (i.hasNext()){
System.out.println(((EmployeeMeeting) i.next()).getMeeting().getMeetingId());
}
System.out.println(e2.getMeetings().iterator().next().getMeeting().getMeetingId());
session.getTransaction().commit();
session.close();
当我只从数据库加载数据时,为什么HIbernate会删除和插入会议
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_0_0_, employee0_.firstname as firstname0_0_, employee0_.lastname as lastname0_0_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
Hibernate: select meetings0_.EMPLOYEE_ID as EMPLOYEE1_0_, meetings0_.MEETING_ID as MEETING2_0_, meetings0_.OPINION as OPINION0_ from EMPLOYEE_MEETING meetings0_ where meetings0_.EMPLOYEE_ID=?
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_0_0_, employee0_.firstname as firstname0_0_, employee0_.lastname as lastname0_0_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
Hibernate: select meetings0_.EMPLOYEE_ID as EMPLOYEE1_0_, meetings0_.MEETING_ID as MEETING2_0_, meetings0_.OPINION as OPINION0_ from EMPLOYEE_MEETING meetings0_ where meetings0_.EMPLOYEE_ID=?
12
11
7
13
7
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
我使用的是Hibernate 3.2.6,我已经编写了一些junits,一切都很好-我在employee_会议桌的数据库中看到:empId、meetID、意见:'17'、'7'、'BETTER'17'、'11'、'NICE'17'、'12'、'NICE'17'、'13'、'NICE'18'、'7',“XX”`您会在映射中具体更改什么?您知道有没有任何示例可以使用附加属性(如意见)对多对多进行建模,但不为employee_meeting table创建单独的XML映射?
Employee e2 = (Employee) session.load(Employee.class, new Long(18));
Employee e = (Employee) session.load(Employee.class, new Long(17));
Iterator i = e.getMeetings().iterator();
while (i.hasNext()){
System.out.println(((EmployeeMeeting) i.next()).getMeeting().getMeetingId());
}
System.out.println(e2.getMeetings().iterator().next().getMeeting().getMeetingId());
session.getTransaction().commit();
session.close();
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_0_0_, employee0_.firstname as firstname0_0_, employee0_.lastname as lastname0_0_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
Hibernate: select meetings0_.EMPLOYEE_ID as EMPLOYEE1_0_, meetings0_.MEETING_ID as MEETING2_0_, meetings0_.OPINION as OPINION0_ from EMPLOYEE_MEETING meetings0_ where meetings0_.EMPLOYEE_ID=?
Hibernate: select employee0_.EMPLOYEE_ID as EMPLOYEE1_0_0_, employee0_.firstname as firstname0_0_, employee0_.lastname as lastname0_0_ from EMPLOYEE employee0_ where employee0_.EMPLOYEE_ID=?
Hibernate: select meetings0_.EMPLOYEE_ID as EMPLOYEE1_0_, meetings0_.MEETING_ID as MEETING2_0_, meetings0_.OPINION as OPINION0_ from EMPLOYEE_MEETING meetings0_ where meetings0_.EMPLOYEE_ID=?
12
11
7
13
7
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: delete from EMPLOYEE_MEETING where EMPLOYEE_ID=? and MEETING_ID=?
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)
Hibernate: insert into EMPLOYEE_MEETING (EMPLOYEE_ID, MEETING_ID, OPINION) values (?, ?, ?)