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