繁体   English   中英

春季数据。 存储库返回错误的 ID(实体数据正确)

[英]Spring Data. Repository returns wrong Id (entity data is correct)

美好的一天,这里有问题:CrudRepository 为实体返回错误的 Id。

这是基本的 JPA 用户实体:

@Data
@Entity(name = "user")
@EqualsAndHashCode(exclude = {"roles", "password", "data"})
@ToString(exclude = {"roles", "password", "data"})
public class User {

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

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
        private SomeData data;
...

与某些数据实体存在一对一的关系。

@Data
@Entity(name = "some_data")
@TypeDefs({
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})
@ToString(exclude = {"user", "views", "biData"})
@EqualsAndHashCode(exclude = {"user", "views", "biData"})
public class SomeData {

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

    @OneToOne
    @MapsId
    private User user;
...

并且有 crud 存储库:

@Repository
public interface SomeDataRepository extends CrudRepository<SomeData, Long> {

    Optional<SomeData> findByUserId(Long userId);
}

方法 findUserById 从 DB 返回正确的 SomeData 实体,但该实体与 userId 具有相同的 ID...因此我无法进行其他活动(插入或更新表“public_view”违反外键约束“fk_view_to_some_data”)

这很奇怪。

问题可能是因为您使用了@MapsId注释。 根据Javadoc ,这是注释的值的作用:

关系属性对应的复合键中的属性名称。 如果未提供,则关系映射实体的主键。

您可以尝试为注释设置特定值,或以不同方式映射您的一对一关系。 例如,在SomeData类中使用@JoinColumn注释:

// ... your annotations ...
public class SomeData {

    // ... your other fields ...

    @OneToOne
    @JoinColumn(name = "some_data_id", referencedColumnName = "id")
    private User user;

}

以下是您可以使用的一些替代方案: https : //www.baeldung.com/jpa-one-to-one

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM