java - 如何将 java.util.Map 与 hibernate xml 中的关联映射?

标签 java hibernate jpa orm hibernate-mapping

我有实体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 {
        ..............................
}

map Teacher.childByName应该映射name Child的属性(property)实体作为键和 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 的单独表。相反,它创建列 childByNamechildName在表中Child 。这很奇怪。

那么,如何映射我的 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;
}

}

这不是 map 关联,它会像这样工作

关于java - 如何将 java.util.Map 与 hibernate xml 中的关联映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24217409/

相关文章:

java - gwt 日期选择器中当前日期以外的日期

java - 使用 super 的原因

java - 调用 "new Configuration().configure().buildSessionFactory()"中的方法时发生 com.sun.jdi.InitationException

java - Hibernate Criteria如何对父子关系上的行计数投影进行排序

java - JPA/hibernate : @PersistenceContext unitName has multiple matches error

java - 在外部缓存中缓存分离的 Hibernate 实体

Java:序列化外部(最终)字段

java - Hibernate 关联对象的标准

java - Intellij 13 EclipseLink 类 [] 未找到错误

java - 查询中的 JPA in 子句