当前位置: 首页 > 知识库问答 >
问题:

使用JPA的实体设计

锺博耘
2023-03-14

我有3个实体-

>

  • 课程

    组件

    时间线课程是一个独立的实体,具有以下属性:课程-(id Integer主键,Course_name)

    @ Id @ Column(name = " Id ")Integer courseId;@Column(name = "course_name ")字符串course _ name;

    接下来是另一个实体模块,模块中的每一行都与一门课程相关,因此模块和课程之间存在一对一的关系。模块-(Module_id、Module_name、Module_type、duration)

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "module_id")
    Integer module_id;
    @Column(name = "module_name")
    String module_name;
    @Column(name = "duration")
    Integer duration;
    @ManyToOne
    @JoinColumn(name="timeline_id", nullable=false)
    private Timeline timeline;
    

    现在,下一步是一个时间线实体,它也与课程相关,即每个时间线ID都属于一个课程ID,但是一个时间线ID可以属于多个module_ids,因此下面的代码:

    @Id
    @Column(name = "timeline_id")
    Integer timelineId;
    @OneToMany( mappedBy = "timeline" )
    private List<Module> module;
    @OneToOne( cascade = CascadeType.ALL)
    private Course course;
    

    你能告诉我这里的错误是什么吗。模块存储:

    @Repository
    public interface ModuleRepository extends JpaRepository<Module, Integer>{
        public List<Module> findAllByTimelineTimelineId(Integer timelineId);
    }
    

    IModuleService

    public interface IModuleService {
         public List<Module> findByTimelineId(Integer timelineId);
    }
    

    ModuleServiceImpl

    public List<Module> findByTimelineId(Integer timelineId) {
            // TODO Auto-generated method stub
            return moduleRepo.findAllByTimelineTimelineId(timelineId);
        }
    

    控制

    @RequestMapping("/gettimeline/{timeline_id}")
                 public List<Module> findByTimelineId(@PathVariable Integer timeline_id){
                        return moduleService.findByTimelineId(timeline_id);
                }
    

    现在,当我在邮递员中运行此网址时:http://localhost:8083/gettimeline/1

    我得到了一个无限循环,我无法解码错误,也有OneTo火映射的任何问题,我是JPA新手:

    [{"module_id":1,"module_name":"Sleep","duration":10,"timeline":{"timelineId":1,"module":[{"module_id":1,"module_name":"Sleep","duration":10,"timeline":{"timelineId":1,"module":[{"module_id":1,"module_name":"Sleep","duration":10,"timeline":{"timelineId":1,"module":[{"module_id":1,"module_name":"Sleep","duration":10,"timeline":{"timelineId":1,"module":[{"module_id":1,"module_name":"Sleep","duration":10,"timeline":{"timelineId":1,"module":[
    

    请帮忙,提前谢谢你:)

  • 共有1个答案

    支阳波
    2023-03-14

    无限循环问题是由一对多关系引起的。有几种方法可以解决这个问题,但是我发现如下所示的视图模型类是最干净的方法。

    请注意,一对多关系的拥有方没有包含在下面的代码中,只有多对一关系。这可以反过来做,但是从你的代码来看,我猜这就是你想要的。

    TimelineVM类

    package no.mycompany.myapp.misc;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
        
    @Data
    @NoArgsConstructor
    public class TimelineVM {
    
        private Integer timelineId;
    
        public TimelineVM(Timeline timeline) {
            this.timelineId = timeline.getTimelineId();
        }
    }
    

    ModuleVM类

    package no.mycompany.myapp.misc;
    
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    public class ModuleVM {
    
        private Integer module_id;
        private String module_name;
        private Integer duration;
        private TimelineVM timeline;
    
        public ModuleVM(Module module) {
            this.module_id = module.getModule_id();
            this.module_name = module.getModule_name();
            this.duration = module.getDuration();
            this.timeline = new TimelineVM(module.getTimeline());
        }
    }
    

    控制器方法

    @RequestMapping("/gettimeline/{timeline_id}")
    public List<ModuleVM> findByTimelineId(@PathVariable Integer timeline_id){
      return moduleService.findByTimelineId(timeline_id).stream().map(ModuleVM::new).collect(Collectors.toList());
    }
    
     类似资料:
    • 我正在做一个小的测试项目,将数据持久化到一个简单的数据库中。我在设置数据实体时遇到了困惑和问题,需要一些帮助。 我将此开发为Spring Boot Java项目,并使用JPA实现持久性功能。我对JPA不是很熟悉。 考虑以下模拟模式: 任务: 任务说明: 状态更改历史: 我不确定注释和构造这些类以促进这种安排的正确方法。我也不确定其中一些关系本质上应该是单向的还是双向的。我看过关于建立单向和双向关系

    • 如何返回与JPA中的父级有关系的实体列表? 我有一个用户实体,在名为的属性上有@OneToMany映射。子实体为Pet类型。这只是一种单向关系。 如何在JPA中编写返回给定用户的所有宠物的连接?

    • 我试图创建一个注册用户的功能。 我遵循了这篇文章中的建议:将空作为id保存,并Hibernate,但解决方案对我不起作用。这是我的用户类 这是我的账户类 我的日志显示了以下输出

    • 我与以下实体类有一个双向的一对多关系: 当然,所有必需的级联选项都是在客户端设置的。但如果在引用现有产品订单时首次持久化新创建的客户端(如本场景所示),则它将不起作用: 已创建并持久化产品订单“%1”。工作正常。 已创建客户端“%2”,并将产品订单“%1”添加到其产品订单列表中。然后它被持久化。不起作用。 我尝试了几个apporach,但没有一个显示出预期的结果。请参阅下面的结果。我在这里阅读了所

    • 我知道类似的问题,但它们是在Hibernate的范围内被问到和回答的。我也有同样的问题,但我正在使用Eclipselink,想知道对于Hibernate,是否有更好的或替代的解决方案。 简单地回顾一下这个问题: 我有两个相互继承的类: 现在我想把一个孩子变成父母,或者反过来。 我希望现在p的数据库行是。 另一种方法是这样的: 在这种情况下,我希望与一起保存,并丢失的值。 然而,上面所描述的并不奏效

    • 我从我的Spring项目中删除了Spring Roo,这是不必要的,而且在eclipse STS中构建花了很多时间。我执行了一个推入,我的实体对象现在包含了旧的Roo文件的源代码。 几乎没有什么变化,包括PersistentContext管理,这看起来很奇怪。事实上,我注意到,每次创建查询时,我都需要实例化实体类以获得EntityManager? 在我的实体类中,我有