我的应用程序需要支持使用其他系统上的注册用户。 这种映射很好,我可以从两个表中加载和查询:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
abstract class User {
private String id; // "username"
}
@Entity
@Table("MY_APP_USER")
abstract class MyAppUser extends User {
// other properties
}
@Entity
@Table("OTHER_APP_USER")
abstract class OtherAppUser extends User {
// other properties
}
问题是在其他实体中的映射,有两种情况,第一种情况:
@Entity
@Table("ERROR")
class Error {
// other properties
@JoinColumn(name = "my_app_user")
@OneToOne(fetch = FetchType.EAGER)
private MyAppUser myAppUser;
@JoinColumn(name = "other_app_user")
@OneToOne(fetch = FetchType.EAGER)
private OtherAppUser otherAppUser;
public User getUser() {
return myAppUser != null ? myAppUser : otherAppUser;
}
public void setUser(User user) {
if (user instanceof MyAppUser)
this.myAppUser = (MyAppUser) user;
else if (user instanceof OtherAppUser)
this.otherAppUser = (OtherAppUser) user;
}
}
这似乎可行,但这是正确的方法吗?
第二种情况,即使阅读了几次文档,这对我来说还是很棘手的:
@Entity
@Table("REPORT")
class Report {
// other properties
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "REPORT_USER",
joinColumns = @JoinColumn(name = "report_id"),
inverseJoinColumns = @JoinColumn(name = "????????"))
private Set<User> setUsers;
}
我无法使用触发器来确保数据完整性,因此我在需要用户的每个位置添加两列:my_app_user和other_app_user。因此,我需要在“ inverseJoinColumns”中指定两列,我该怎么做?我像在Erro课堂上那样映射了两次,并在gette / setter中进行了变通?还有另一种方法吗?
答案 0 :(得分:0)
我也遇到了ManyToMany问题,我从原始帖子中删除了代码,而不是使用@JoinTable,而是为@JoinTable创建了一个实体,并在映射中使用了该实体。