- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Dozer 将 Hibernate 实体映射到它们的 DTO。一个简化的示例类如下:
@Entity
public class Role {
@Id
@GeneratedValue
@Column(name="RoleId", nullable=false)
public int roleId;
@Column(name="RoleName", nullable=false)
@NotEmpty
public String roleName;
//get + set (not for the roleId since its autogenerated)
}
public class RoleDTO {
private int roleId;
private String roleName;
public RoleDTO(int roleId, String roleName) {
this.roleId = roleId;
this.roleName = roleName;
}
public RoleDTO() {}
//gets + sets
}
现在映射工作正常,但我在尝试进行更新时遇到问题。假设我的数据库中有一个角色 (1,"Administrator")。我的 View 首先生成具有更新字段的 DTO:
RoleDTO roleDTO = new RoleDTO(1, "admin");
最终持久化 Role 的类接收 DTO 并通过 Dozer 将其转换为实体类以持久化更改:
Role role = DozerMapper.map(roleDTO,Role.class);
此时,我的角色实体已经失去了它的ID,大概是因为ID列被定义为自增,而我显然不能更新空ID实体。
那么我应该如何解决这个问题,以便将 ID 和更新的字段全部映射到实体?我总是可以将实体对象带入 hibernate 状态,并用 DTO 中的字段更新它的每个字段并将其保存回来,但这会破坏使用 Dozer 的全部目的。
感谢您的帮助。
最佳答案
在这种情况下,为 Role
实体上的 roleId
提供 setter 是一种完全有效的方法。然后 Dozer 也会设置 ID。 (此外,我假设您在 Role
上的字段并不是真正公开的。)
使用 Dozer,您可以从 DTO 创建一个实体。那时,实体是分离的,即不与 Hibernate session 关联。然后,您应该使用 session.merge(role)
来保存更改。
关于java - 使用 Java、Dozer 和 Hibernate 将 DTO 映射和更新到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474169/
我想在使用 Dozer 映射两个类时映射来自 Java 类的常量,如下面字段 2 所示的示例映射所示。 除了 Factory Bean 实例之外,在 Dozer 中是否有更简洁的方法来执行此操作..
我正在使用 Dozer Java Beans 之间转换的框架。我想使用 Dozer 的 Java Api 而不是 XML 创建我的映射,以便能够操作和配置我的自定义转换器。 如果我在下面的代码中使用替
我是 Dozer 的新手,我正在尝试将字符串映射到 bool 值,反之亦然。谁能告诉我 Dozer 支持这个还是我必须创建一个自定义转换器。该字符串将包含 true 或 false,因此将直接映射。此
Dozer API Mappings示例页面没有说明如何指定 is-accessible XML attribute 的等价物.可能吗? 最佳答案 你可以这样做: mapping(clazzA, cl
我正在尝试执行下面的推土机示例。我的 xml 文件与 java 文件位于同一位置,但我收到文件未找到异常 Exception in thread "main" org.dozer.MappingExc
根据此示例,您可以使用 Dozer 进行深度映射: http://dozer.sourceforge.net/documentation/deepmapping.html com.github
我正在尝试使用 Dozer 从 JAXB 实体“JaxbParent”填充 Hibernate 实体 - “Parent”。 我的 hibernate 实体: public class Parent
为什么这不适用于 Dozer?我需要做什么才能实现这一目标?我们有无数的枚举,有时我们只需要在它们之间进行映射。我们可以通过配置推土机来执行此操作而不需要编写自定义内容吗? enum EnumOne{
我有两个 bean,一个有五个属性,另一个有四个。如果我只是想忽略额外的属性,如何配置映射? 我看到的所有排除示例都对第一类和第二类都有参数。 最佳答案 您不需要做任何事情; Dozer 应该可以立即
我有两个值对象(ValueObjectA 和 ValueObjectB),每个对象都有 name1 和 name2 然后我有两个列表,每个列表都包含一个值对象,我计划用推土机映射它。 一旦我访问映射的
我正在使用 Dozer 进行对象映射。一切都工作得很好,只是我无法映射这个特定的东西。 User UAUserBean RightLst.Right Rights Right UARightBea
我有:_class A 包含属性:String userId、String a、String b。如何使用 Dozer 映射将 A 类 映射到 B 类(以及其他方式)_class B 具有属性:用户
无论出于何种原因,Dozer 不允许我映射具有不同名称的字段,它只是根据源对象映射字段。 在我的 dozerBeanMapping.xml 文件中,我有: data.SourceObject
您好,我正在创建 dozer bean 映射 xml 以从一个对象转换为另一个对象。现在我需要根据条件映射这些 bean。例如: if(A == "Static") A
我一直在努力解决如何在 Dozer 中使用泛型映射到对象,但经过大量搜索后没有找到任何可以帮助我的东西。 我正在尝试将我编写的一些对象映射到其他人创建的一些对象。我开始使用注释并看到类似的错误,因此我
如您所知,dozer 使用相同的字段名在两个 bean 之间进行映射,但我如何才能简单地更改此映射策略。 public class Product { private String produc
我有两个单独的对象要映射: Class A { List listAA; // get set methods... } Class B{ C objectC = new C(
是否可以排除字段的子字段?例如字段“item”包含另一个“subItem”。如何排除正在映射的“子项”? test.ClassA test.ClassB
我们使用 Dozer 将实体映射到 dto 对象。 我们遇到以下问题:假设我们有一个与 B 实体具有一对多关系的 A 实体。映射时,我们希望将 B 实体中的字段 produktId(例如 1234)转
如何将一个对象映射到另一个(现有)对象(不包括空字段)? 例如: class A { String a1; String a2; } class B { String a1;
我是一名优秀的程序员,十分优秀!