[英]How to map java.util.Map with associations in hibernate xml?
我有實體Person
,如下所示:
@Entity
@Table(name = "Person")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "personName", length = 16, nullable = false)
private String name;
.....................
}
我有實體Teacher
,如下所示:
@Entity
@Table(name = "teacher")
@PrimaryKeyJoinColumn(name = "PersonId")
public class Teacher extends Person implements Serializable {
private Map<String, Child> childByName = new HashMap<>();
......................................
}
我有如下實體Child
:
@Entity
@Table(name = "CHILD")
@PrimaryKeyJoinColumn(name = "PersonId")
public class Child extends Person implements Serializable {
..............................
}
映射Teacher.childByName
應該將Child
實體的name
屬性映射為鍵,將Child
實體映射為值。 之間的關系, Teacher
和Child
是一個一對多的。
我需要此映射為xml格式。 現在,我在Person.hbm.xml中完成了此操作:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.masterhibernate.SimpleHibernateDemo.Person"
table="Person">
<cache usage="read-write" />
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name">
<column name="name" length="24" not-null="true" />
</property>
<property name="surname">
<column name="surname" length="36"></column>
</property>
<property name="address">
<column name="address" length="32"></column>
</property>
<joined-subclass name="com.masterhibernate.SimpleHibernateDemo.Parent"
table="Parent">
<key column="person_id" foreign-key="parent_person" />
<property name="job" column="WorkPlace" length="22" type="string" />
<set name="children" inverse="true" cascade="save-update" lazy="true">
<cache usage="read-write" />
<!-- specifies foreign key column of child table -->
<key column="ParentPK" />
<one-to-many class="com.masterhibernate.SimpleHibernateDemo.Child" />
</set>
</joined-subclass>
<joined-subclass name="com.masterhibernate.SimpleHibernateDemo.Child"
table="Child">
<key column="person_id" foreign-key="child_person" />
<property name="toy" column="toy" length="55" type="string" />
<many-to-one name="parent"
class="com.masterhibernate.SimpleHibernateDemo.Parent" column="ParentPK"
lazy="false" fetch="join" foreign-key="child_parent" />
<set name="teachers" table="TeacherPupil" inverse="true" lazy="true">
<key column="child_id" foreign-key="teacherPupil_child" />
<many-to-many class="com.masterhibernate.SimpleHibernateDemo.Teacher"
column="teacher_id" />
</set>
</joined-subclass>
<joined-subclass name="com.masterhibernate.SimpleHibernateDemo.Teacher"
table="Teacher">
<key column="person_id" foreign-key="teacher_person" />
<property name="subject" column="subject" length="25" type="string" />
<set name="children" table="TeacherPupil" lazy="false" fetch="join">
<cache usage="read-write" />
<key column="teacher_id" foreign-key="teacherPupil_teacher" />
<many-to-many class="com.masterhibernate.SimpleHibernateDemo.Child"
column="child_id" />
</set>
<map name="childByName" table="Child_By_Name" embed-xml="true">
<key column="childByName_id" />
<index column="childName" type="string" />
<one-to-many class="com.masterhibernate.SimpleHibernateDemo.Child" />
</map>
</joined-subclass>
</class>
</hibernate-mapping>
不幸的是<map>
甚至沒有創建名為Child_By_Name
單獨表。 相反,它在表Child
創建了childByName
和childName
列。 這很奇怪。
那么,如何將childByName
Map映射到單獨的表中以引用Child
作為其值?
我很感謝所有答案,但是您可以做的另一件事是,創建一個實體:
@Entity
@XmlRootElement(name = "ChildName")
@Table(name="ChildName")
public class ChildName{
@Id
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "childId")
private Child child;
}
並以
@Entity
@XmlRootElement(name = "Teacher")
@Table(name="Teacher")
public class Teacher {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "childNameId")
private ChildName childName;
}
您的整個代碼會喜歡
@Entity
@XmlRootElement(name = "Teacher")
@Table(name="Teacher")
public class Teacher {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "childNameId")
private ChildName childName;
}
@Entity
@XmlRootElement(name = "ChildName")
@Table(name="ChildName")
class ChildName{
@Id
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "childId")
private Child child;
}
@Entity
@XmlRootElement(name = "Child")
@Table(name="Child")
public class Child extends Person implements Serializable {
}
@Entity
@XmlRootElement(name = "Person")
@Table(name="Person")
public class Person implements Serializable {
@Id
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
不是地圖關聯,它將像那樣工作
由於您已經有一個TeacherPupil表,因此您也應該將其用於Map關聯:
<map name="childByName" table="TeacherPupil" inverse="true">
<key column="teacher_id" not-null="true"/>
<map-key-many-to-many column="name" class="Child"/>
<many-to-many class="Child"/>
</map>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.