实体对象与值对象-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
会给我错误信息
@Entity
,@Id
,@Column
,等等)验证器
(通常与数据索引一起使用)
对于最后一个问题,这是为表示层和持久层提供两个不同对象的原因之一。通过这种方式,值对象可以匹配用户(表单)显示或输入的内容。实体对象是普通旧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的书《域驱动设计》。