我正在使用 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 reporitories,如下所示,
import com.model.Person;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PersonRepository extends JpaRepository <Person, Long> {
}
如何使用Generic属性创建此接口。这也可以(使用动态代码生成)来持久化Person对象吗?
答案 0 :(得分:1)
您可以使用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();