【发布时间】: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