将外键字段添加到javabean

时间:2015-07-26 03:15:29

标签: java database javabeans

考虑这个没有ORM /的常规javabean:

// primary key is auto incremented by the database, so I can't add it
public class User {
    String name;
    int personID; // foreign key
    // no args constructor
    // getter/setters for fields
}

这样做可以吗?我个人认为它没有意义,因为没有理由通过bean操纵外键,但我可能错了。是否存在这样的用例?

2 个答案:

答案 0 :(得分:0)

我通常会这样做。

public class Person {

    private final String id;

    public Person(String id) {
        this.id = id;
    }

    public Person() {
        this.id = UUID.randomUUID().toString();
    }

}

public class User {

    private final String id;
    private String personId;

    public User(String id, String personId) {
        this.id = id;
        this.personId = personId;
    }

    public User() {
        this.id = UUID.randomUUID().toString();
    }

    public String getPersonId() {
        return personId;
    }

    public void setPersonId(String personId) {
        this.personId = personId;
    }

}

User的另一个选择是使其不可变。在这种情况下,它看起来像这样。

public class User {

    private final String id;
    private final String personId;

    public User(String id, String personId) {
        this.id = id;
        this.personId = personId;
    }

    public User(String personId) {
        this.personId = personId;
        this.id = UUID.randomUUID().toString();
    }

    public String getPersonId() {
        return personId;
    }

}

现在,这些类可以以自动增量或非自动增量的方式使用。基本上,选项是让类创建自己的唯一ID或传递给它的唯一ID。

我看到的一个常见困境是,当id不存在时,对象却存在。在程序中创建对象时就是这种情况,但是尚未为其分配ID(可能由DB插入时创建)。在这种情况下,bean可能看起来像这样。

public class User {

    private String id;
    private final String personId;

    public User(String id, String personId) {
        this.id = id;
        this.personId = personId;
    }

    public User(String personId) {
        this.personId = personId;
    }

    public String getPersonId() {
        return personId;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

请注意,id不是final,因此对象可以在不存在id的情况下存在,并且可以在以后添加(

答案 1 :(得分:0)

最好以面向对象的方式对对象及其关系进行建模。

public class User {
    private long id;
    private Person person;
    // .... Removed for clarity
}