gpt4 book ai didi

java - Spring Boot JPA 存储库类的 Byte Buddy 运行时生成

转载 作者:行者123 更新时间:2023-12-01 09:01:41 26 4
gpt4 key购买 nike

我正在使用Byte Buddy生成JPA实体和JPA存储库。我能够生成 JPA 实体,但无法继续生成相应的 JPA 存储库。以下是代表 Person 实体的代码,

import javax.persistence.*;
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

protected Person(){}

@Override
public String toString() {
return String.format("Person[id=%d]",id,name);
}
}

我可以使用 Bute Buddy 生成上述内容,如下所示,

Class<?> type = new ByteBuddy()
.subclass(Object.class)
.name("Person")
.defineField("id", Integer.class, Visibility.PRIVATE)
.defineMethod("getId", Integer.class, Visibility.PUBLIC)
.intercept(FieldAccessor.ofBeanProperty())
.defineMethod("setId", void.class, Visibility.PUBLIC).withParameter(Integer.class)
.intercept(FieldAccessor.ofBeanProperty())
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();

现在我想生成相应的 Spring boot Jpa 存储库,如下所示,

import com.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PersonRepository extends JpaRepository <Person, Long> {

}

如何使用 Generic 属性创建此接口(interface)。这也可以(使用动态代码生成)来持久化 Person 对象吗?

最佳答案

您可以使用TypeDescription.Generic.Builder::parameterizedType来创建泛型类型:

TypeDescription.Generic genericType = TypeDescription.Generic.Builder
.parameterizedType(JpaRepository.class, type, Long.class)
.build();

然后,您可以将此泛型类型提供给 ByteBuddy::makeInterface:

DynamicType dt = new ByteBuddy()
.makeInterface(genericType)
.name("com.model.Person")
.make();

Byte Buddy 生成的类无法与 javac 生成的类区分开来,因此这应该按预期工作。

关于java - Spring Boot JPA 存储库类的 Byte Buddy 运行时生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41615861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com