与构造函数的通用一对多关系

如何解决与构造函数的通用一对多关系

我有一个使用通用的一对多关系的实体。不幸的是,lobmok @AllArgsConstructor 无法映射/发布 List 扩展到 List 。 EducationTranslation和Translatable的属性完全相同,而EducationTranslation 扩展可翻译。 如果删除自定义构造函数,则会出现以下错误:

不能将java.lang.Long字段EducationTranslation.id设置为 可翻译

有没有注释或设计模式可以使我摆脱自己编写的构造函数并使代码更简洁明了?

@OneToMany(
    targetEntity = EducationTranslation.class,cascade = CascadeType.ALL,fetch = FetchType.LAZY)
private List<? extends Translatable> translationList = new ArrayList<>();


public Education(Long id,Profile profile,Collection<? extends Translatable> translationList) {
    this.id = id;
    this.profile = profile;
    this.translationList = translationList
        .stream()
        .map(x -> new EducationTranslation(x.getId(),x.getCode(),x.getTranslation()))
        .collect(Collectors.toList());
}

解决方法

使用通配符约束的集合对于JPA实体来说有点不方便。

请注意,在初始创建之后,您将无法在不进行强制转换的情况下将任何内容插入声明为List<? extends Translatable>的列表中,这意味着以下代码将不起作用:

Education education = entityManager.find(Education.class,id);
education.getTranslationList().add(new EducationTranslation(...)); // compilation error

它的行为之所以如此,是因为List<? extends Translatable>被解释为“扩展了Translatable的某些未知元素类型的列表”,并且编译器不允许您的代码向该列表中添加任何内容,不知道确切的类型?代表什么。我想您会希望.add(new EducationTranslation())是合法的,因为EducationTranslation 确实扩展了Translatable,但这是为什么不能允许它的更好说明。 :

List<Dog> dogs = new ArrayList<>(List.of(new Dog())); //just a mutable collection with a Dog inside
List<? extends Animal> someAnimals = dogs; //a list of Dogs is a list of 'a type that extends Animal',so - valid assignment
someAnimals.add(new Cat()); //hey,a Cat does extend Animal,so this should be legal,right?
Dog shapeshifter = dogs.get(1); //...right???

总而言之,简单地将translationList声明为List<EducationTranslation>将会更加方便。

为什么我可以最初添加元素并将其保存在日期存储中,但是在尝试使用相同的对象签名添加元素时却出现编译错误

您没有使用“相同签名”。您的代码在任何时候都调用.add()。它仅构造一个有效类型为List<EducationTranslation>的List,然后将其分配给声明为List<? extends Translatable>的字段。问题是,由于声明字段的方式,而不是您为其分配的内容,因此无法使用存储在该字段中的引用来调用.add(new EducationTranslation())。与以下代码段中的场景几乎相同:

Object obj = "Hello";
obj.length(); // you know obj points to a String,but you assign it to a reference with a more general type,so this call is illegal

请注意,如果要从Education类的 client 隐藏列表元素的具体类型,则以下代码仍然合法:

interface TranslationHolder {

    List<? extends Translatable> getTranslationList();
}

class Education implements TranslationHolder {

    private List<EducationTranslation> translationList = new ArrayList<>();

    //this getter is a valid implementation for TranslationHolder.getTranslationList()
    public List<EducationTranslation> getTranslationList() {
        return translationList;
    }
}

class ClassThatUsesEducationButOnlyKnowsItAsTranslationHolder  {

   public void execute() {
        TranslationHolder holder = getEducationAsTranslationHolderInSomeIndirectWay();
        holder.getTranslationList(); // this still return a reference to List<? extends Translatable>,NOT List<EducationTranslation>
   }
}

因此,如果要从EducationTranslation类的 client 中提取Education,则无需将字段本身声明为通配符列表

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res