Привет, ребята, я везде искал это, так что это буквально последнее средство, я пытаюсь получить хорошую структуру базы данных для следующего кода:
@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 для пользователей и групп, а остальное я получаю из другой базы данных, но это другая история:)