0

好的。我在这里有点困惑......

可以说我有一个名为User.

   class User {
     // all variables
     // all getters and setters
   }

现在,我使用 JSR 303 验证并在此处放置@NotNull,@Range等作为变量。

我将其用作 Form / Command 对象。意思是,当提交表单时,值会被验证并BindingResult给我错误。

  1. 是否也应该将其用作 Hibernate 的实体对象?(如果是这样,我需要在 Validation 注释之上添加其他 Hibernate 注释,如@Entity, @Id,等)@Column
  2. 当我们从数据库加载数据时,这些验证是否也会启动?(如果是,如果数据已经存在,并且不确认验证怎么办?)
  3. 我们通常在哪里编写业务验证,例如数据库中是否存在国家/地区,xyz 值是否存在于不同的表中等?

这里也出现了问题: - 用户表单可能没有用户类中存在的所有字段 - 数据库表用户可能比用户类有更多或更少的字段 - 表单也可能有来自不同对象的字段,比如用户和和命令。

我们如何处理这些?

试图围绕它

4

2 回答 2

1
  1. 不,您不应该混合实体对象和值对象。实体对象用于数据库映射,值对象用于表示层。
  2. 要验证注解的对象,您需要使用Validator(通常与DataBinder.Spring验证一起使用)
  3. 是数据库约束还是后端验证?

对于您的最后一个问题,这是您的表示层和持久层有 2 个不同对象的原因之一。这样,值对象可以匹配用户(表单)显示或输入的内容。

于 2013-02-06T21:12:28.187 回答
1

实体对象是我们普通的旧java类(POJO)模型/业务类的对象,需要使用Hibernate将其持久化到数据库中,而值类型对象是另一个类的对象,但它作为实体对象的一部分存储在数据库表中。

@Embeddable
@Data
@AllArgsConstructor
public class Address{
    private  String country;
    private String city;
    private String street1;
    private String street2;
    private postalCode;
}
@Entity
@Data
@AllArgsConstructor
public class Person{
    @Id
    private Long id;
    private String firstName;
    private String lastName;
    private ing age;
    private Address address;
}
}

因此,在 spring 和 hibernate 项目中运行此代码后,您将看到数据库中的 Person 表是使用它的属性和 Address 类属性创建的。有关更多信息,我建议阅读以下内容:[ https://www.decodejava.com/hibernate-value-type-object.htm][1]

于 2020-04-10T13:20:10.127 回答