实体对象与值对象-Hibernate和Spring

实体对象与值对象-Hibernate和Spring,spring,hibernate,validation,model-view-controller,entity,Spring,Hibernate,Validation,Model View Controller,Entity,好的。我在这里有点困惑 假设我有一个名为User的类 class User { // all variables // all getters and setters } 现在,我使用JSR303验证并在这里为变量放置@NotNull,@Range等 我使用它作为表单/命令对象。也就是说,当表单a提交时,值会被验证,并且BindingResult会给我错误信息 这也应该作为Hibernate的实体对象使用吗?(如果是这样,我需要在验证注释的顶部添加其他Hiber

好的。我在这里有点困惑

假设我有一个名为
User
的类

   class User {
     // all variables
     // all getters and setters
   }
现在,我使用JSR303验证并在这里为变量放置
@NotNull
@Range

我使用它作为表单/命令对象。也就是说,当表单a提交时,值会被验证,并且
BindingResult
会给我错误信息

  • 这也应该作为Hibernate的实体对象使用吗?(如果是这样,我需要在验证注释的顶部添加其他Hibernate注释,如
    @Entity
    @Id
    @Column
    ,等等)
  • 当我们从数据库加载数据时,这些验证是否也起作用?(如果是,如果数据已经存在,且未确认验证,该怎么办?)
  • 我们通常在哪里编写业务验证,例如,国家/地区是否存在于数据库中,xyz值是否存在于其他表中,等等
  • 这里也出现了问题: -用户窗体可能没有用户类中存在的所有字段 -数据库表用户的字段可能比用户类多,也可能比用户类少 -表单也可能有来自不同对象的字段,比如User和Order

    我们如何处理这些问题

    试着让我的思想围绕着它

  • 不,您不应该混合实体对象和值对象。实体对象用于DB映射,值对象用于表示层
  • 要验证注释的对象,需要使用
    验证器
    (通常与
    数据索引一起使用)
  • 是DB约束还是后端验证

  • 对于最后一个问题,这是为表示层和持久层提供两个不同对象的原因之一。通过这种方式,值对象可以匹配用户(表单)显示或输入的内容。

    实体对象是普通旧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表是使用其属性和地址类属性创建的。 有关更多信息,我建议阅读以下内容:
    [

    不,您不应该将实体对象公开给表示层。您可以对业务层和表示层使用Spring验证框架。您的验证与DB约束不同吗?@user2033853所以您是说我应该有两个对象,一个用于前端,另一个用于域/实体?我们如何命名它们?有参考资料吗?你可以看看域驱动设计:这是对“值对象”的虚假使用,你一定想到了DTO。@Nathanhoughes有没有参考你的建议?@Kevin:。你还可以看到Evans的书《域驱动设计》。