jpa hibernate注解问题

huwehgph  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(468)

我有三个实体,我正在建模,并与相关的注解有问题。我基本上有一个类,我打算返回给调用者,一个嵌套的项目列表,项目可以包含一个嵌套的端点列表。它是一个顶级has,一对多,然后嵌套的一对多有两个一对多。
我和你玩过 @JoinColumn 注解,我试图 @ManyToOne 在一家公司的另一边(但它不喜欢,它是一个漫长的…)。我只是个新手,不知道怎么做。我认为 mappedById 是解决办法,但我不确定。
主要问题:这段代码允许我“保存”到数据库,但是在检索时,downdecetorpackage中的项目列表是空的。
cascadetype.all抛出我不完全理解的引用完整性错误。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Builder                                                                               
public class DownDetectorPackage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@OneToMany(mappedBy="id",fetch = FetchType.EAGER)
private List<Project> projects;

@Temporal(TemporalType.DATE)
private Date dateJobsLastRan;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Project{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String projectName;
    @OneToMany(mappedBy="id")
    private List<Service> externalDependencies;
    @OneToMany(mappedBy="id")
    private List<Service> endpoints;
}
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Service {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String url;
    private Boolean endpointIsUp;
    private String serviceName;
}
6pp0gazn

6pp0gazn1#

您应该将每个联接列标记为joincolumn,表示从其他实体引用的列。然后,您应该说明使用此列的关系类型。

public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String projectName;

    @JoinColumn(referencedColumnName = "id")
    @OneToMany(fetch = FetchType.LAZY)
    private ExternalDependencyEntity externalDependencies;

    @JoinColumn(referencedColumnName = "id")
    @OneToMany(fetch = FetchType.LAZY)
    private EndpointEntity endpoints;
}

最后,请注意,在关系数据库中,每个fk列只能取1个值(引用的实体id的pk),因此,在实体上,应将数据类型标记为引用的实体,而将no标记为集合。
我想这能解决你的问题。

qvsjd97n

qvsjd97n2#

您应该使用@joincolumn而不是mappedby。当您在另一个类中也使用了@manytoone时,可以使用mappedby。
所以你的最后一堂课应该是这样的(这也适用于你提到的其他课程):

public class DownDetectorPackage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@JoinColumn(name = "downDetectorPackageId")
@OneToMany(fetch = FetchType.EAGER)
private List<Project> projects;

@Temporal(TemporalType.DATE)
private Date dateJobsLastRan;

另外,请记住在@joincolumn注解中声明父对象名称,因为它将为该外键创建列。

相关问题