java - 在 JPA/Hibernates 中使用 @GeneratorType 时如何知道生成器类中的字段名称
问题描述
作为非主键序列生成的一部分,我@GeneratorType
在实体字段上使用。在生成器类中,我需要知道它已被调用的字段。帮助表示赞赏。
@Entity(name = "student")
public class Student {
@GeneratorType(type = IdGenerator.class, when = GenerationTime.INSERT)
private Integer secId;
}
public class IdGenerator implements ValueGenerator<Integer>{
@Override
public Integer generateValue(Session session, Object owner) {
// I want secId here
}
}
解决方案
你可以尝试使用这样的东西:
public interface EntityId {
Integer getId();
}
@Entity(name = "student")
public class Student implements EntityId {
@GeneratorType(type = IdGenerator.class, when = GenerationTime.INSERT)
private Integer secId;
@Override
public Integer getId() {
return secId;
}
// ...
}
@Entity
public class OtherEntity implements EntityId {
// ...
}
public class IdGenerator implements ValueGenerator<Integer> {
@Override
public Integer generateValue(Session session, Object owner) {
if (!(owner instanceof EntityId)) {
throw new IllegalArgumentException("IdGenerator can be used only with entities that implement EntityId interface");
}
// I want secId here
Integer id = ((EntityId) owner).getId();
}
}
如果您使用 Java 14 或更高版本,则可以将模式匹配用于 instanceof作为更优雅的构造。
public class IdGenerator implements ValueGenerator<Integer> {
@Override
public Integer generateValue(Session session, Object owner) {
if (owner instanceof EntityId entityId) {
// I want secId here
Integer id = entityId.getId();
// ...
} else {
throw new IllegalArgumentException("IdGenerator can be used only with entities that implement EntityId interface");
}
}
}
推荐阅读
- javascript - 如何将键值列表转换为对象数组?
- c++ - 我如何知道在我插入 unordered_map 后是否发生了“rehash”?
- python - 如何为关系添加第二个数组,以便聊天机器人询问来自第二个数组的关系?
- c# - 从数据集表中一一写入excel表
- c# - 如何在 C# 中解析 Kusto 时间跨度字符串?
- powershell - 如何让 Docker Compose 在 Windows Server 2016 上运行
- python - 如何调整具有多个通道的 tiff 图像的大小?
- math - 如何根据框架(游戏窗口)的大小相对于其位置 Y 调整精灵的大小?
- mysql - 查找停机时间并计算停机时间长度
- python-3.x - 尝试使用 confluent_kafka python 将 csv 文件推送到 kafka 主题时出错