Я знаю, что это распространенный вопрос, но я не нашел другого, который разрешил бы мои сомнения.
Обычно, если проект небольшой, я сохраняю аннотации в том же объекте, который представляет объект предметной области. Это позволяет загружать объект из базы данных и сохранять все установщики закрытыми, гарантируя, что любой экземпляр всегда находится в допустимом состоянии. Что-то вроде:
@Entity
class SomeEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String attribute1;
private String attribute2;
private String attribute3;
// ... other attributes
protected SomeEntity() {}
/* Public getters */
public Long getId() { ... }
public String getAttribute1() { ... }
public String getAttribute2() { ... }
/* Expose some behaviour */
public void updateAttributes(String attribute1, String attribute2) {
/* do some validations before updating */
}
}
Моя проблема возникает, если я хочу иметь другую постоянную модель. Тогда у меня было бы что-то вроде:
/* SomeEntity without persistent info */
class SomeEntity {
private Long id;
private String attribute1;
private String attribute2;
private String attribute3;
// ... other attributes
protected SomeEntity() {}
/* Public getters */
public Long getId() { ... }
public String getAttribute1() { ... }
public String getAttribute2() { ... }
/* Expose some behaviour */
public void updateAttributes(String attribute1, String attribute2) {
/* do some validations before updating */
}
}
и ДАО:
@Entity
class SomeEntityDAO {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String attribute1;
private String attribute2;
private String attribute3;
public SomeEntityDAO() {}
/* All getters and setters */
}
Мой вопрос: как я могу сопоставить SomeEntityDAO с SomeEntity, не раскрывая атрибуты SomeEntity?
Если я создам такой конструктор, как: public SomeEntity(String attribute1, String attribute2, ...) {}
, то любой может создать недопустимый экземпляр SomeEntity. То же самое произойдет, если я сделаю все сеттеры общедоступными в SomeEntity.
Я также не думаю, что это правильное решение для создания объекта с использованием updateAttributes()
, так как это выполнит некоторые проверки, которые я не хочу выполнять на данный момент (мы доверяем данным, которые сохраняются в базе данных).
Я думаю о защите всех сеттеров, чтобы DAO мог расширить Entity и иметь доступ к сеттерам... но я не уверен, что это хороший вариант.
Каков наилучший или распространенный подход к решению этой проблемы?