【问题标题】:complex JPA inheritance with JAXB specific contract具有 JAXB 特定合同的复杂 JPA 继承
【发布时间】:2011-12-08 08:37:07
【问题描述】:

大家好,我已经到处搜索了这个,所以这实际上是最后的手段,我正在尝试为以下代码获取一个很好的数据库结构:

@Entity
@Table(name = "tasks")
@XmlRootElement(name = "task")
@XmlType(propOrder = { "id", "taskTitle", "notifications" })
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "identifier")
    private String taskTitle;

    @OneToMany(mappedBy = "???super.task???", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<User> users;

    @OneToMany(mappedBy = "task", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Group> groups;

    @XmlElement(name = "notify_list")
    public Notify getNotifications() {
        return new Notify(this);
    }
... (the users and groups getters are XmlTransient)
}

@XmlAccessorType
@XmlType(propOrder = { "users", "groups" })
public class Notify {
    private Task task;
    public Notify() {
        super();
    }

    public Notify(Task task) {
        this.task = task;
    }

    @XmlElementWrapper(name = "users")
    @XmlElements({ @XmlElement(name = "user") })
    public Set<User> getUsers() {
        return task.getUsers();
    }

    @XmlElementWrapper(name = "groups")
    @XmlElements({ @XmlElement(name = "group") })
    public Set<Group> getGroups() {
        return task.getGroups();
    }
}

@MappedSuperclass
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    private Task task;

    @Column(name = "person_id")
    private Integer personId;

    @Transient
    private String firstName, lastName, email;

...(public getters/setters here)
}

@Entity
@Table(name = "persons")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "group_or_user")
@DiscriminatorValue(value = "group")
@XmlAccessorType
@XmlType(propOrder = { "personId", "firstName", "lastName", "email" })
public class Group extends Person {
    ...(inherits everything from Person and defines XmlElements)
}

@Entity
@DiscriminatorValue(value = "user")
@XmlAccessorType
@XmlType(propOrder = { "username", "personId", "firstName", "lastName",
    "email", "phone" })
public class User extends Group {

    @Transient
    private String username, phone;

    @XmlElement(name = "username")
    public String getUsername() {
        return username;
    }

    @XmlElement(name = "phone")
    public String getPhone() {
    return phone;
    }

...(the other getters/setters are inherited)
}

我也想要这样的 xml:

<task>
    <id>10001</id>
    <identifier>Title of the task</identifier>
    <notify_list>
      <users>
        <user>
          <username>firstname.lastname</username>
          <person_id>12</person_id>
          <firstname>FirstName</firstname>
          <lastname>LastName</lastname>
          <email>me@myname.com</email>
          <phone>023545848796</phone>
        </user>
      </users>
      <groups>
        <group>
          <person_id>21247415</person_id>
          <firstname>PizzaGroup</firstname>
          <lastname>Pizza</lastname>
          <email>blabla@something.com</email>
        </group>
      </groups>
    </notify_list>
</task>

我的意思是漂亮的数据库结构:1 个任务表和 1 个人员表(当然还有鉴别器列)。如您所见,我在用户集上的 OneToMany 关系遇到了问题,因为它说“它找不到对未知目标实体 i mapBy 的用户的任何引用,即在 MappedSuperclass 中定义的任务人所以我知道它应该继承它,因为 Group 继承了它。所以问题实际上是:我做错了什么?

编辑:

我忘了提到我只能为用户和组保留 person_id,其余的我从另一个数据库获得,但这是另一回事 :)

【问题讨论】:

    标签: annotations jaxb jpa-2.0 one-to-many single-table-inheritance


    【解决方案1】:

    mappedBy 属性值应为“任务”。问题是 Person 中的任务字段的类型是 MaintenanceTask 而不是 Task

    另外,请确保所有实体都列在休眠配置文件中。

    但我认为这种映射行不通,因为您尝试在一侧定义两个不同的关联,由另一个大小上的单个(和单个列)映射。由于组的集合也将包含用户(作为用户扩展组),您可能应该删除任务中设置的用户。只需根据组的实际类型提供两个返回过滤集合的 getter。

    【讨论】:

    • 感谢 JB Nizet 我没有在我的问题中发现那个错误,但我的问题仍然存在,我的课程实际上被命名为 MaintenanceTask 但为了便于阅读,我将其重命名为 Task
    • 检查我的编辑:你确定每个实体都列在休眠配置文件中吗?
    • 谢谢,但是因为我使用注解,所以我只使用 persistence.xml 文件来设置持久性单元
    • 根据应用程序的打包方式,您可能仍需要列出实体类。见docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/…。你能包括你得到的异常的堆栈跟踪吗?
    • 对不起,我留下了一点...有一篇关于 Three Level Entity Hierarchy 的 java2s 文章并关注了它。因此,现在我创建了两个抽象类,一个带有注释 @MappedSuperclass 的 AbstractPerson 由实体 Person 扩展,该实体创建表“persons”并设置继承,并且 User 和 Group 都扩展 Person 并且它可以工作。这一切都很好,但是现在当我执行 em.createQuery("from Task").getResultList() (从 Task 获取所有对象)时,它会将 Group 与 User 混淆并发送 WrongClassException
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2021-06-12
    • 2011-12-02
    • 1970-01-01
    • 2011-06-20
    • 2013-05-14
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多