【问题标题】:Long property as foreign key in JPA entity长属性作为 JPA 实体中的外键
【发布时间】:2019-05-01 20:31:18
【问题描述】:

我有两张表 Review 和 Bedrijfsgegevens。 Review 表有一个主键 (reviewId) 和一个外键 (bedrijfId)。 BedrijfId 是 Bedrijfsgegevens 表中的主键(作为 Id)。我遇到了这个问题,因为我试图在 Review 表中添加一个带有 BedrijfId 的行,该行在 Bedrijfgegevens 表中不存在,并且理所当然地得到了一个异常。

我尝试使用 @ManyToOne 和 @JoinColumn 注释来防止获取此异常。但是,我得到一个异常说“IllegalArgumentException:无法将 java.lang.Long 字段 org.loepr.loeprservices.models.Bedrijfsgegevens.id 设置为 java.lang.Long”

@Entity
@Data
@Table(name = "bedrijfreviews")
public class Review {

    @ManyToOne(targetEntity = Bedrijfsgegevens.class)
    @JoinColumn(name = "bedrijfid")
    private Long bedrijfId;

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

    //other properties
}
@Entity
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Bedrijfsgegevens {

    @Id
    @JsonProperty("Id")
    private Long id;

    //other properties
}

我希望在 JPA 实体中创建主键和外键之间的关系,这样当我使用不存在的 bedrijfId(外键)作为 Bedrijfgegevens 表中的主键时,我不会遇到异常。

【问题讨论】:

    标签: java jpa foreign-keys


    【解决方案1】:

    字段Review.bedrijfId 应声明为Bedrijfsgegevens;例如

    @Entity
    @Data
    @Table(name = "bedrijfreviews")
    public class Review {
    
        @ManyToOne(targetEntity = Bedrijfsgegevens.class)
        @JoinColumn(name = "bedrijfid")
        private Bedrijfsgegevens bedrijf;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @JsonProperty("reviewId")
        @Column(name = "reviewid")
        private Long reviewId;
    
        //other properties
    }
    

    【讨论】:

    • 嗨,布赖恩,感谢您的回答。我以前试过这个,我遇到了两个问题。首先,如果我添加一个不存在的 bedrijfid,它会抛出一个 javax.persistence.EntityNotFoundException,这并不能解决我的应用程序及时处理这种情况的问题。其次,现在控制器中的请求需要一个完整的 Bedrijfsgegevens 对象,我只想包含 Bedrijfsgegevens 对象的 bedrijfId 字段。我该如何解决这些问题?
    • 当您收到 EntityNotFoundException 时,我不确定您在做什么。我需要更多细节。但是,如果您真的只想拥有 bedrijfId 值,则可以使用简单的 Basic 映射,因为您不需要 ManyToOne 映射。然后,您将需要手动获取目标对象。
    • 如果您只想要它而不想要所有其他属性怎么办?必须有一种方法来指定主键
    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 2012-07-09
    • 2023-02-10
    • 2017-04-13
    • 2021-12-03
    • 1970-01-01
    • 2015-09-22
    • 2015-06-07
    相关资源
    最近更新 更多