如何在hibernate中将数据库中的非规范化多对多关系(逻辑)映射?

时间:2015-01-19 16:14:13

标签: java hibernate orm many-to-many

我有一个名为person的表,用于存储应用程序中人员的详细信息。为了映射到我的应用程序,我有一个名为Person的类,其中相应的属性集映射到表的列。

一个人的一个属性是那个人的爱好,这可能是多重的。我还有一个名为hobby的爱好主表。

当然,这是一个多对多关系,应该使用第三个表来建模,比如 person_hobby 。但是我的应用程序用例只需要在他/她的个人资料页面上列出一个人的爱好。因此,我没有制作第三个表格,而是放置了一个逗号分隔的爱好字符串,我可以在应用程序中将其拆分并迭代以在页面上显示它。

但我希望在我的pojo Person中它应该被建模为List<String>而不是一个逗号分隔值的字符串,并相应地具有getter和setter。

我应该如何以正确的方式进行映射。

我想到的一件事是在hobbiesStr类中创建另一个属性Person并将其映射到列hobbies并复制List<String>的setter和getter,这样List的getter就可以操作string的csv并动态创建一个列表。但是,我如何使用setter作为字符串的getter和getter来处理hibernate呢?

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码映射逗号分隔列表。我怀疑你是否也可以用hobbies表格映射它。我的意思是你不会有一个外键或任何可以自动检查列表中的所有项目是否在爱好表中都有适当记录的东西。此外,如果您在保存人员记录后为某人创建记录并从hobbies表中提供一些爱好,即使您有一个人,也不会阻止从hobbies表中删除所有记录在他/她的名单中有这些爱好。

    private String hobbies;

    public List<String> getHobbies() {
        if (null == hobbies) {
            return null;
        }
        String[] hobbiesArray = hobbies.split(",");
        List<String> result = new ArrayList<>(hobbiesArray.length);
        for(String hobby: hobbiesArray) {
           result.add(hobby);
        }
        return result;
    }

    public void setHobbies(List<String> hobbies) {
        if (null == hobbies) {
            return;
        }
        StringBuilder stringBuilder = new StringBuilder();
        Iterator<String> iterator = hobbies.iterator();
        while (iterator.hasNext()) {
            stringBuilder.append(iterator.next());
            if(!iterator.hasNext()) {
                break;
            }
            stringBuilder.append(",");
        }
        this.hobbies = stringBuilder.toString();
    }

考虑到这种方法可能带来的所有混乱,我会在我决定采用这种方式之前三思而后行