当前位置: 首页 > 知识库问答 >
问题:

spring boot JPA存储库类的字节伙伴运行时生成

戚繁
2023-03-14

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

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属性创建这个接口。这也能(使用动态代码生成)持久化Person对象吗?

共有1个答案

楚硕
2023-03-14

您可以使用类型描述。通用的生成器::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();

字节伙伴生成的类不能与javac生成的类区分开来,因此这应该和预期的一样有效。

 类似资料:
  • 我有一个大小为n的数组,它代表我的主内存。我不能使用运算符new,我只能访问内存,所以每个数据结构只能使用那个数组来存储数据。我正在尝试构建内存分配器,它将能够快速找到内存(数组)的空闲部分并释放它们。我想在这个数组上构建树状结构--伙伴内存分配--但我很难理解几个概念。 buddy系统是如何使用二叉树查找空闲内存块的? 我如何创建那棵树的新节点(我应该只是在程序开始时为我的树保留足够的空间还是动

  • 我在使用Byte Buddy时遇到了一个简单的问题,下面是我的代码: 我希望工作并将调用转发到受人尊敬的拦截器实例,但是我得到这个异常: 最奇怪的部分在异常消息的最后: 我做错了什么?

  • 我试图通过java应用程序中的所有外部调用传递监视/跟踪信息。为了使其透明,我尝试使用byte-buddy,但在使其工作时遇到了一些困难。 为了跟踪每个传入的(http)请求,我截获了HttpServlet。service(),从HttpServletRequest中提取令牌头,并将其放在名为TokenHolder的类中的静态ThreadLocal中。 为了跟踪每个传出(超文本传输协议)请求,我拦

  • 京东金融 App介绍 [京东金融](jr.jd.com)京东金融是京东数字科技集团旗下专注于金融科技服务的重要业务板块。 京东金融始终基于强大的数字科技能力,致力于为让消费者享受专业、安全的数字金融服务,旗下包含个人和企业两大服务体系。 在个人金融领域,“京东金融App”作为载体,通过独有的大数据技术及人工智能风控能力,携手400多家银行、120余家保险公司、110余家基金公司,已为过亿的消费者精

  • 在我的场景中,我在运行时在“com.mrg.domain”包下生成hibernate实体类。在我的通用restcontroller中,我可以根据@PathVariable创建这些实体的实例。以下代码适用于此。。 现在,我试图实现的下一步是一个通用的jpa存储库(如下所示),这样我就可以持久化运行时生成的模型,而无需为每个实体实现存储库。但是还没有找到解决方案。 下面的主题和许多其他主题实现了通用存

  • 「Container+」联盟是由 DaoCloud 于今年6月份发起的开放性组织。联盟以打造立体生态、共赢容器市场为目标,旨在推动容器技术在企业落地。 联合产业链上下游的合作伙伴 共同推动企业级容器云平台发展 帮助企业实现互联网的架构和业务双转型 如您有意成为 DaoCloud 「Container+」联盟成员,请与我们联系。