在具有延迟加载字段的bean上等于

时间:2013-06-21 13:39:26

标签: java

假设我有一个豆子:

class File {

    private id;
    private String name;
    private User author;
    private List<User> users;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!super.equals(obj)) {
            return false
        }
        if (!(obj instanceof File)) {
            return false;
        }
        File other = (File) obj;

        if (getId() == null) {
            if (other.getId() != null) {
                return false;
            }
        } else if (!getId().equals(other.getId())) {
            return false;
        }
        if (getName() == null) {
            if (other.getName() != null) {
                return false;
            }
        } else if (!getName().equals(other.getName())) {
            return false;
        }
        if (getAuthor() == null) {
            if (other.getAuthor() != null) {
                return false;
            }
        } else if (!getAuthor().equals(other.getAuthor())) {
            return false;
        }
        if (getUsers() == null) {
            if (other.getUsers() != null) {
                return false;
            }
        } else if (!getUsers().equals(other.getUsers())) {
            return false;
        }

        return true;
}

    ...

    getters/setters
}

使用MyBatis或任何其他持久框架将此bean映射到/到数据库。 重要的是用户是延迟加载的(当第一次调用getUsers()时,它们是从DB加载的。)

我的问题是,什么等于方法应该有这个bean?

我应该包含id字段(它是数据库主键)吗?

我应该包含用户列表吗?在Java对象上经常调用Equals(例如,当它们存储在集合中时),因此这会破坏惰性方法。

1 个答案:

答案 0 :(得分:0)

你说id是主键,所以id是唯一的。因为id是唯一的,所以你只需要equals方法中的那个字段。