【发布时间】:2026-01-03 16:35:01
【问题描述】:
我将通过一个描述性的例子来解释我自己。假设我们正在使用 JPA 编写一个非常简单的云存储,所以我们有两个主要类,User 和 File,编码如下:
class User {
List<File> ownFiles;
Map<File, Integer> sharedFiles;
}
class File {
User author;
Map<User, Integer> sharedUsers;
}
我应该如何注释这些字段?我试过了,但我总是得到NotSerializableException“data too long for column”。
顺便说一下,
File只是一个例子,我的真实班级很小,只是由一些字符串组成。所以我很确定NotSerializableException是因为 Map 注释而被抛出的。-
顺便说一下,这里有地图值的含义,
- 在
User的情况下,文件的整数值代表用户对该文件的权限级别 - 在
File的情况下,密钥是文件已共享给的那些用户,值是该用户对File的权限级别
- 在
P.S:我正在使用 Eclipselink
【问题讨论】:
-
NotSerializableException 是因为如果你没有注释它,它会默认为一个基本的映射并尝试序列化对象。仅仅向我们展示集合并不能帮助我们告诉您如何映射它 - 您需要告诉我们您想要用它做什么,整数值来自哪里以及应该存储等等。从任何显示的 JPA 教程开始多对多映射。
-
可能引擎希望以“残酷”、非关系的方式(如 BLOB/CLOB 等)存储此字段,因此请尝试序列化。 JPA 不能以对象关系的方式存储地图。建议重新设计,JPA 中的项目必须保持规则并不总是与经典 OOP 一致,即 Map 不好。
-
建议文件使用不同的类名
标签: java hibernate jpa jakarta-ee eclipselink