Java JPA Hibernate注释问题

Java JPA Hibernate注释问题,java,hibernate,jpa,jdbc,entity,Java,Hibernate,Jpa,Jdbc,Entity,我有三个实体正在建模,并且在相关注释方面存在问题。我基本上有一个我打算返回给调用方的类,一个嵌套的项目列表,项目可以包含一个嵌套的端点列表。它是一个顶级的has-a一对多,然后嵌套的一对多有两个一对多 我玩过@JoinColumn注释,我尝试在OneToMany的另一边放一个@ManyToOne(但它不喜欢这样,它是一个长的..)。我只是个新手,不知道该怎么做。我认为mappedById是解决方案,但我不确定 主要问题:此代码允许我“保存”到数据库,但在检索时,DownDetectorPacka

我有三个实体正在建模,并且在相关注释方面存在问题。我基本上有一个我打算返回给调用方的类,一个嵌套的项目列表,项目可以包含一个嵌套的端点列表。它是一个顶级的has-a一对多,然后嵌套的一对多有两个一对多

我玩过
@JoinColumn
注释,我尝试在OneToMany的另一边放一个
@ManyToOne
(但它不喜欢这样,它是一个长的..)。我只是个新手,不知道该怎么做。我认为
mappedById
是解决方案,但我不确定

主要问题:此代码允许我“保存”到数据库,但在检索时,DownDetectorPackage中的项目列表为空

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;

您应该将每个联接列标记为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),因此,在实体上,应将数据类型标记为引用的实体,将否标记为集合


我认为这可以解决您的问题。

您应该使用@JoinColumn而不是mappedBy。当您在另一个类中也使用了@ManyToOne时,可以使用MappedBy,但您没有

因此,您的最终课程应该是这样的(这也适用于您提到的其他课程):

公共类DownDetectorPackage{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@JoinColumn(name=“downDetectorPackageId”)
@OneToMany(fetch=FetchType.EAGER)
私人清单项目;
@时态(TemporalType.DATE)
私人日期dateJobsLastRan;

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

需要我做一些事务性的或其他的吗?保存时,我现在看到此设置中出现以下错误--hh000010:批处理发布时,它仍然包含JDBC语句:org.hibernate.transientObject除外ion:object引用了一个未保存的瞬态实例-在刷新之前保存该瞬态实例:com.usaa.pc.property.downdetector.model.project需要级联类型。所有的集合--虽然都有效。这两个答案都是正确的,但他只是通过跟踪帮助:(我需要做一些事务性的或其他的事情吗?在保存时,我现在看到了这个设置的以下错误--hh000010:在批处理发布时,它仍然包含JDBC语句:org.hibernate.transientObject异常:对象引用了一个未保存的临时实例-在刷新之前保存临时实例:com.usaa.pc.property.downdecetor、 model.Projection如果遇到这样的错误,那么请检查是否已经为新创建的对象(即Project)传递了“ID”。对于新条目,它应该为null。我需要级联类型。所有集合都是这样,不过这是可行的。
@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;
}
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;
}
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;