Реализуйте проверки в сеттерах или используйте Hibernate Validator.

Я столкнулся с дизайнерским решением в моем проекте GWT + Hibernate.

Я объясню свой вопрос, используя сущность компании.

@Entity
@Table(name = "Company")
public class Company extends LightEntity implements BaseSerializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "Code")
    private String code;
    @Column(name = "Name")
    private String name;

    @Column(name = "Address")
    private String address;

    @Column(name = "ContactNumber1")
    private String contactNumber1;

    @Column(name = "ContactNumber2")
    private String contactNumber2;

    @Column(name = "EMail")
    private String email;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = CascadeType.ALL)
    private List<CompanyRegistration> companyRegistrations = new ArrayList<CompanyRegistration>();

    public Company() {
    }
    public Company(String code, String name) {
        this.setCode(code);
        this.setName(name);
    }

    // getters & setters
}

Действительный объект Company всегда должен иметь допустимый код и имя. Остальные свойства необязательны. Следовательно, я предоставил конструктор с двумя аргументами, чтобы обеспечить создание действительного объекта.

В настоящее время.

Я привык проверять данные в сеттерах. Я также использую эти сеттеры в своих конструкторах. Это гарантирует, что новый объект всегда имеет допустимое состояние. Это мой план по внедрению объектов Hibernate.

Однако GWT-RPC предписывает использовать конструктор noargs по умолчанию, чтобы его можно было использовать для отложенной привязки. Но это также позволит любому создать пустой объект, что нежелательно в большинстве моих сущностей Hibernate. Например, компания всегда должна создаваться с кодом и названием. Конструктор noargs игнорирует это правило.

Теперь в Hibernate реализован стандарт (JSR-303, если мне не изменяет память) для фреймворка валидации. Он позволяет вам вызывать проверки уже созданного объекта.

Моя проблема возникла из-за конструктора noargs. Если бы это не было обязательным, я бы покончил с проверками в сеттере.

Если я реализую проверки в сеттерах, это означает, что недопустимый объект выйдет из строя как можно быстрее. Мне не нужно будет вызывать проверку объекта на стороне клиента. Но пустой объект (созданный с помощью конструктора noargs) не может быть проверен таким образом. Это может привести к сервису, подразумевая, что я также должен реализовать проверки, многие из которых могут быть такими же, как сеттеры, на уровне сервиса.

Если я реализую структуру проверки, то мне придется вызывать проверку для каждого объекта, который я создаю на стороне клиента. Если я забуду проверить один из них, он может перейти на сервисный уровень в недопустимом состоянии. Однако я могу легко использовать ту же структуру на сервисном уровне.

Одно из решений, о котором я подумал, состоит в том, чтобы в любом случае реализовать проверки в установщиках, но также использовать валидатор на уровне службы перед отправкой объекта для сохранения в базе данных. Таким образом, клиентская сторона будет автоматически ограничена сеттерами. С другой стороны, если пустой объект каким-либо образом отправляется на сторону сервера, он будет обнаружен валидатором на сервисном уровне. В обоих случаях пользователю будет выдано исключение.

Однако я думаю, что это не лучшее решение. Итак, я хотел бы получить один.

РЕДАКТИРОВАТЬ. В любом случае я использую аннотации для наложения ограничений на поля сущностей, чтобы Hibernate мог использовать их для проверки перед сохранением объекта.


person Jayesh Bhoot    schedule 04.02.2013    source источник


Ответы (1)


Если ваша проблема связана только с обязательным конструктором без аргументов для GWT-RPC, обратите внимание, что вы можете сделать этот конструктор недоступным для разработчиков (даже private, если хотите); GWT-RPC будет обращаться к нему с помощью отражения независимо от его видимости.

person Thomas Broyer    schedule 04.02.2013
comment
ну блин! Я никогда не думал об этом. Я только что сделал конструктор по умолчанию закрытым, и это сработало! Я думаю, что это завершает мою проблему. Однако я хотел бы знать, что бы вы на самом деле предпочли делать, если бы это не было единственной проблемой. - person Jayesh Bhoot; 04.02.2013
comment
Я решил реализовать проверки в сеттерах. Теперь, когда проблема с конструктором noargs решена, мое приложение всегда будет иметь допустимое состояние для объекта. Уровень обслуживания по-прежнему будет иметь ненулевое ограничение в качестве проверки. Однако я также реализую аннотации ограничений Hibernate для сущностей, чтобы в случае необходимости я мог использовать Hibernate Validator на сервисном уровне для проверки. - person Jayesh Bhoot; 04.02.2013