Java 解决存储库中一对一关系的正确方法?

Java 解决存储库中一对一关系的正确方法?,java,spring-boot,jpa,Java,Spring Boot,Jpa,我在pen和许可证之间有一对一的关系,现在我想在LicenseRepository中通过pen的属性找到一个许可证,例如序列号。我必须如何在存储库中定义它,我的方法是 尝试使用命名查询,但当我在LicenseRepository中调用findBySerial(String serial)方法时,会出现一个例外,即LicenseEntity中没有序列属性,这是正确的,但它在PenEntity中 它位于被许可方实体中。我认为spring boot确实有点vodoo意识到了有一个通透性,它包含一个串行

我在pen和许可证之间有一对一的关系,现在我想在LicenseRepository中通过pen的属性找到一个许可证,例如序列号。我必须如何在存储库中定义它,我的方法是 尝试使用命名查询,但当我在LicenseRepository中调用findBySerial(String serial)方法时,会出现一个例外,即LicenseEntity中没有序列属性,这是正确的,但它在PenEntity中 它位于被许可方实体中。我认为spring boot确实有点vodoo意识到了有一个通透性,它包含一个串行属性。用spring boot实现这一点的正确方法是什么

    @Repository("LicenseRepository")
    public interface LicenseRepository
            extends JpaRepository<LicenseEntity, Long>, JpaSpecificationExecutor<LicenseEntity> {

        LicenseEntity findBySerial(String serial);
        LicenseEntity findByPenId(String penId);

    }



    @AllArgsConstructor
    @Data
    @Entity
    @Table(name = "License")
    public class LicenseEntity {

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

        @Column(nullable = true)
        private String firstUse;

        @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        @JoinColumn(name = "pen_uid", referencedColumnName = "uid")
        private PenEntity pen;

        public LicenseEntity(PenEntity pen){
            this.pen = pen;
        }


    }


           @AllArgsConstructor
    @Data
    @NoArgsConstructor
    @Entity
    @Table(schema = "epls_dbo", name = "Pen")
    public class PenEntity {

        @Id
        @Column(name = "uid", nullable = false, unique = true)
        private Long id;

        @Column(name = "penid", nullable = false, unique = true)
        private Long penId;

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

        @Column(nullable = false, columnDefinition = "boolean(Types#BIT)")
        boolean userLocked;

        @Column(nullable = false, columnDefinition = "boolean(Types#BIT)")
        boolean adminLocked;

        @Column(nullable = false, columnDefinition = "boolean(Types#BIT)")
        boolean gplsAccess;

        @Column( columnDefinition = "boolean(Types#BIT)")
        boolean defaultPkpAccess;

        @Column(nullable = false)
        int maxUpdateCounter;

        @Column
        byte[] symmetricKey;

        @Column
        String comment;

        @Column(nullable = false, columnDefinition = "boolean(Types#BIT)")
        boolean justActivated;

        @Column
        byte[] activationKey;

        @Column(nullable = false, columnDefinition = "penactivationstatus(Types#INTEGER)")
        int activationStatus;

        @Column(name = "serial", insertable = false, updatable = false, columnDefinition = "nvarchar(Types#NVARCHAR)")
        private String serial;

        @Enumerated(EnumType.STRING)
        PenHardware hardware;

        @Transient
        String firstUsage;


    }
@Repository(“LicenseRepository”)
公共接口许可证存储库
扩展JpaRepository、JpaSpecificationExecutor{
许可证实体findBySerial(字符串序列);
被许可人实体findByPenId(字符串penId);
}
@AllArgsConstructor
@资料
@实体
@表(name=“许可证”)
公共类被许可人实体{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“uid”)
私人长id;
@列(nullable=true)
私人字符串优先使用;
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“pen\u uid”,referencedColumnName=“uid”)
私人钢笔;
公共许可实体(PenEntity pen){
this.pen=笔;
}
}
@AllArgsConstructor
@资料
@诺尔格构装师
@实体
@表(schema=“epls\u dbo”,name=“Pen”)
公共类透度{
@身份证
@列(name=“uid”,nullable=false,unique=true)
私人长id;
@列(name=“penid”,nullable=false,unique=true)
私人长盆;
@列(name=“penPassword”)
私有字符串密码;
@列(nullable=false,columnDefinition=“boolean(类型#位)”)
布尔用户锁定;
@列(nullable=false,columnDefinition=“boolean(类型#位)”)
布尔锁;
@列(nullable=false,columnDefinition=“boolean(类型#位)”)
布尔gplsAccess;
@列(columnDefinition=“boolean(类型#位)”)
布尔缺省pkpaccess;
@列(nullable=false)
int-maxUpdateCounter;
@纵队
字节[]对称性;
@纵队
字符串注释;
@列(nullable=false,columnDefinition=“boolean(类型#位)”)
布尔值被激活;
@纵队
字节[]激活键;
@列(nullable=false,columnDefinition=“penactivationstatus(Types#INTEGER)”)
int激活状态;
@列(name=“serial”,insertable=false,updateable=false,columnDefinition=“nvarchar(类型#nvarchar)”)
私有字符串序列;
@枚举(EnumType.STRING)
硬件;
@短暂的
字符串优先使用;
}
您可以使用

List<LicenseEntity> findByPenSerial(String serial)
List findByPenSerial(字符串序列)

List findByPen\u序列(字符串序列)

仅供参考

除非我遗漏了任何东西,否则您发布的长度不包含任何
序列属性。正确的标签不是SpringData而不是SpringBoot吗?你是对的,我的错,我编辑了我的文章。你是说findByPenSerial
List<LicenseEntity> findByPen_Serial(String serial)