сложное наследование JPA с конкретным контрактом JAXB - PullRequest
0 голосов
/ 15 октября 2011

Привет, ребята, я везде искал это, так что это буквально последнее средство, я пытаюсь получить хорошую структуру базы данных для следующего кода:

@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 наследует это. Так что вопрос на самом деле: что я делаю неправильно?

EDIT:

я забыл упомянуть, что могу сохранять только person_id для пользователей и групп, а остальное я получаю из другой базы данных, но это другая история:)

1 Ответ

0 голосов
/ 15 октября 2011

Значением атрибута mappedBy должно быть «задание».Проблема в том, что поле задачи в Person имеет тип MaintenanceTask вместо Task.

Кроме того, убедитесь, что все объекты перечислены в файле конфигурации Hibernate.

Но ядумаю, что это отображение не сработает, потому что вы пытаетесь определить две разные ассоциации на одной стороне, отображаемые одной (и одним столбцом) на другой размер.Поскольку коллекция групп также будет содержать пользователей (поскольку пользователь расширяет группу), вам, вероятно, следует удалить пользователей, заданных в задаче.Просто предоставьте два метода получения, которые возвращают отфильтрованную коллекцию в зависимости от фактического типа группы.

...