每个具体类的表继承映射和OneToMany

时间:2019-03-22 18:03:38

标签: hibernate jpa inheritance

我的应用程序需要支持使用其他系统上的注册用户。 这种映射很好,我可以从两个表中加载和查询:

@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中进行了变通?还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

我也遇到了ManyToMany问题,我从原始帖子中删除了代码,而不是使用@JoinTable,而是为@JoinTable创建了一个实体,并在映射中使用了该实体。