【问题标题】:I seem to need both @OneToOne and @OneToMany relationship我似乎需要@OneToOne 和@OneToMany 关系
【发布时间】:2021-10-30 07:43:04
【问题描述】:

我正在编写一个应用程序来操作应该在不同位置重复设置和关闭的硬件集合。

我想跟踪这些安装,因此我为物理对象本身和安装创建了单独的实体。

Station 对象需要跟踪最多一个(未安装时为 null)活动安装信息(如 @OneToOne)以及所有以前的安装信息(如 @OneToMany)

@Entity
@Table(name = "station")
class Station{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne(mappedBy = "stationInstallation", cascade = CascadeType.DETACH, 
    CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH)
    @JoinColumn(name = "station_installation_id", nullable = true)    
    private StationInstallation activeStationInstallation;
    ...

    @OneToMany(fetch = FetchType.Lazy, mappedBy = "station_id", cascade =      
    {CascadeType.DETACH, CascadeType.PERSIST, 
    CascadeType.MERGE, CascadeType.REFRESH })

    private List<stationInstallation> stationInstallations;
    
    ...
}

其他实体将具有站 ID、位置和设置日期以及 shutdownDateTime 为空。

 @Entity
 @Table(name = "stationInstallation")
 class StationInstallation{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne(mappedBy ="stationInstallation", cascade - CascadeType.ALL)
    private Station station;

    @Column(name = "location")
    private String location;

    @Column(name = "setupDateTime")
    private LocalDateTime setupDateTime;

    @Column(name = "shutdownDateTime")
    private LocalDateTime shutdownDateTime

}

最后,shutdown 方法应该通过将 activeStationInstallation 设置为 null 并将 shutdownDateTime 设置为 LocalDateTime.NOW 来解除实体与 Station 实体的连接。

    ...
    stationInstallation.getStation().setActiveStationInstallation(null);
    stationInstallation.setShotdownDateTime(LocalDateTime.NOW);
    ...

但这显然会导致越来越多的 StationInstallation“已完成”对象,这似乎需要 @ManyToOne 与 Station 的关系,而我想保持 @OneToOne 与 activeStationInstallation 的关系。

做什么?

我想我可以创建另一个实体,将其命名为 FinishedStationInstallation,从 StationInstallation 中删除 shutdownDateTime,使其不可变,而不是使用 setter 添加shutdownDateTime,然后在删除活动版本时将其添加到构造函数中。不变性是一种资产,但同时我必须向数据库添加几个新表,并跟踪和查询两个实体而不是一个。

编辑:我想我可以从第一个实体中删除 List stationInstallations,因为我真的不需要在数据库查询之外跟踪它,但为了清楚问题,我添加了它。

【问题讨论】:

    标签: spring spring-boot hibernate hibernate-mapping


    【解决方案1】:

    我会这样建模:

    @Entity
    @Table(name = "station")
    class Station{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;
    
        @OneToOne(cascade = CascadeType.DETACH, 
        CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH)
        @JoinColumn(name = "station_installation_id", nullable = true)    
        private StationInstallation activeStationInstallation;
        ...
    
        @OneToMany(fetch = FetchType.Lazy, mappedBy = "station", cascade =      
        {CascadeType.DETACH, CascadeType.PERSIST, 
        CascadeType.MERGE, CascadeType.REFRESH })
    
        private List<stationInstallation> stationInstallations;
        
        ...
    }
    
     @Entity
     @Table(name = "stationInstallation")
     class StationInstallation{
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;
    
        @ManyToOne(mappedBy ="stationInstallation", cascade = CascadeType.ALL)
        private Station station;
    
        @Column(name = "location")
        private String location;
    
        @Column(name = "setupDateTime")
        private LocalDateTime setupDateTime;
    
        @Column(name = "shutdownDateTime")
        private LocalDateTime shutdownDateTime
    
    }
    
    • 从站到安装的一对一关系有一个 FK => 所以没有映射
    • Station 到安装的一对多关系由安装时的station 关联映射,显然必须是多对一关联,因为另一侧是一对多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2017-05-22
      • 2018-10-21
      • 2013-12-26
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      相关资源
      最近更新 更多