【问题标题】:Associating Nested Object IDs in Spring JPA在 Spring JPA 中关联嵌套对象 ID
【发布时间】:2016-11-28 19:28:17
【问题描述】:

在我的 Spring MVC/JPA 应用程序中,我针对其数据库表定义了 User 和 Department 实体。通常许多用户可以属于一个部门,所以我的用户类中有以下内容

@Entity(name = "USER")
public class User {

    @Id
    @Column(name = "Username")
    private String username;

    @ManyToOne
    @JoinColumn(name = "Department")
    private Department department;

}

当需要保存新用户时,我必须将用户与部门 ID 相关联

User
username     | BobbySurfs2020
departmentId | 43

我是否需要在我的用户对象上定义一个额外的departmentId 字段只是为了建立这种关联,或者我可以以某种方式使用嵌入的部门对象来设置这个 ID 通过我的设置器setDepartment()

更新/补充想法:

是否有必要像我在这里一样将Department 嵌套在User 对象中?我认为为我获取的每个用户存储Department 会比仅关联Department ID 占用更多的内存。这样,如果我随时需要部门信息,我只需通过与用户关联的 ID 来查找它们。想法?

非常感谢!

【问题讨论】:

  • 不,您只需在数据库的用户表中添加departmanId,然后通过名称获取departman,然后在用户上设置departman并保存它,还将Joincolumn(departman)更改为joincolumn(departmanid)
  • 谢谢@mithatkonuk。我还认为可能有必要存储 Department 并改用 ID
  • 那是因为 orm 关系,您只需将存储在 db 中的 departman 提供给您,这样您就可以远离复杂的过程,您也可以在用户类中使用 id 来设置和保存它也可以,但我建议你这样会更酷
  • 顺便说一句,您也可以使用仅具有用户列表的部门和用户没有部门对象的单向 orm 这样您就可以摆脱许多在不同用户上相同的部门对象

标签: java spring-mvc jpa


【解决方案1】:

我是否需要在我的用户对象上定义一个额外的部门 ID 字段才能建立这种关联。

没有

是否有必要像我在这里一样将 Department 嵌套在 User 对象中?

是的。您正在使用 Object 关系映射器来映射对象。

在 MVC 世界中,您可以通过转换器轻松处理此问题,该转换器将获取从 UI 传递的 ID,查找相关实体并将其设置在正在编辑的实体上。

@Component
public class StringToDepartmentConverter implements Converter<String, Department> {

    @Autowired
    private DepartmentService service;

    /**
     *departmentId is the HTTP post param passed in by the framework
     */
    public Department convert(String departmentId ) {
        return  service.findDepartment(Integer.parseInt(departmentId ));
    }
}

向框架注册:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "..." })
public class MvcConfiguration extends WebMvcConfigurerAdapter{

    //other configuration

    @Override
    public void addFormatters(FormatterRegistry formatterRegistry) {
        formatterRegistry.addConverter(departmentConverter());
    }

    @Bean
    public StringToDepartmentConverter departmentConverter(){
        return new StringToDepartmentConverter ();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多