lombok对jpa有副作用吗

2024-01-10

我正在努力将 jpa 实体转换为使用 lombok。结果代码如下:

@Entity
@Table(name = "TEST")
@Data
@NoArgsConstructor
@AllArgsConstructor
class Test {
   ...
   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   private FormatType formatType;
   ...
}

生成的错误消息包含以下内容

Caused by: org.hibernate.HibernateException: Missing column: formatType in TEST

我真的不知道要在这里谷歌搜索什么。 (我之前尝试粘贴所有内容formatType进入谷歌 - 没有看到任何东西)

NOTE:

  1. 为了简洁和隐私起见,字段已被重命名,并且似乎不相关的方面已被省略。如果某些内容看起来像是拼写错误,那么很可能就是这样。如果您发现任何问题,请告诉我,以便我解决。

  2. 描述该字段的 3 行与我正在使用的代码相比没有变化

EDIT:

我刚刚在错误消息出现之前注意到这一点

13:22:19,967 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (ServerService Thread Pool -- 57) HHH000261: Table found: TABLE
13:22:19,967 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (ServerService Thread Pool -- 57) HHH000037: Columns: [..., formatType, ...]
13:22:19,968 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 57) MSC000001: Failed to start service jboss.persistenceunit."...": org.jboss.msc.service.StartException in service jboss.persistenceunit."...": javax.persistence.PersistenceException: [PersistenceUnit: ...] Unable to build EntityManagerFactory

应该是功能性的

  @Entity
  @Inheritance(strategy = InheritanceType.JOINED)
  @Table(name = "PARENT")

  public abstract class Parent implements Serializable {

     private static final long serialVersionUID = 1;
     @Id
     @Column(name = "ID")
     @GeneratedValue
     private long id;
     @Column(name = "ENABLED")
     private boolean enabled;
  }

  @Entity
  @Table(name = "CHILD")
  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  public class Child extends Parent {
     /** XXX: HERE BE DRAGONS */
     @Column(name = "ENUM_1")
     @Enumerated(EnumType.STRING)
     private Enum1 enum1;
     @Column(name = "ENUM_2")
     @Enumerated(EnumType.ORDINAL)
     private Enum2 enum2;
     /** XXX: NO MORE DRAGONS */
     @Column(name = "FREQUENCY")
     private String frequency;
     @Column(name = "EMPTY")
     private boolean empty;
     @Column(name = "MAX_SIZE")
     private int maxSize;
  }
  public enum Enum1 {
     A,
     B,
     C
  }
  public enum Enum2 {
     X,
     Y,
     Z
  }

我已经回滚了 lombok 更改,我仍然想知道问题是什么,但并不着急。另外,由于这个可爱的小错误,我大约落后了 4 个小时,所以我的回复可能有点慢。

子表的 pk 是父表的 fk,如果没有 lombok,一切似乎都可以工作,尽管事实上Child班级没有 id。

解决方案:

我完全忘记问这个了。不久前我又重新审视了这个问题。为了解释该解决方案,让我们看一下我包含的第一个示例的稍微简化的版本。

@Entity
@Table(name = "TEST")
@Setter
@Getter
class Test {
   ...
   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   private FormatType formatType;
   ...
}

Lombok 似乎会给你这个:

@Entity
@Table(name = "TEST")
class Test {
   ...
   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   private FormatType formatType;

   public FormatType getFormatType() {
      return formatType;
   }
   public void setFormatType(FormatType formatType) {
      this.formatType = formatType;
   }
   ...
}

请注意,注释仍然附加在field。现在,我不确定这是否只是我们正在使用的 JPA 的版本或实现,但我认为如果定义了访问器,jpa 只会忽略除此之外的任何注释@Column(以及为@Column- 这就是为什么 jpa 寻找错误的列名称)。所以我们实际上需要:

@Entity
@Table(name = "TEST")
class Test {
   ...
   private FormatType formatType;

   @Column(name = "FORMATTING")
   @Enumerated(EnumType.ORDINAL)
   public FormatType getFormatType() {
      return formatType;
   }
   public void setFormatType(FormatType formatType) {
      this.formatType = formatType;
   }
   ...
}

经过大量的困惑,试图找到示例并填写一些有关 lombok 如何执行其操作的细节(公平地说,我很容易混淆),我发现了这个小宝石:onMethod=@__({@AnnotationsHere}) https://projectlombok.org/features/experimental/onX。利用这个功能,我想出了以下内容:

@Entity
@Table(name = "TEST")
@Setter
class Test {
   ...
   @Getter(onMethod=@__({
         @Column(name = "FORMATTING"),
         @Enumerated(EnumType.ORDINAL)
      }))
   private FormatType formatType;

   ...
}

很快就起作用了。现在我们有了显然是唯一可用的解决方案,我想解决我们目前都在思考的问题:这真的比手动编写方法并在其中附加注释更干净吗?回答:……我不知道。我很高兴我找到了解决方案。


真奇怪。你能展示更多代码吗? 我正在尝试编写一个简单的项目,其中包含您问题中的部分代码,并且它有效。我使用了 Spring Boot 和 MySQL。尝试检查您的配置。有我的代码:

Enum:

public enum FormatType {

    FIRST_TYPE, SECOND_TYPE
}

MySQL 中的表:

create table TEST
(
    ID int auto_increment primary key,
    FORMATTING int not null
);

Entity:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "TEST")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "FORMATTING")
    @Enumerated(EnumType.ORDINAL)
    private FormatType formatType;
}

存储库:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TestRepository extends JpaRepository<Test, Integer> {
}

Service:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService {

    private TestRepository repository;

    @Autowired
    public TestService(TestRepository repository) {
        this.repository = repository;
    }

    public List<Test> getAllTestEntities() {
        return repository.findAll();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lombok对jpa有副作用吗 的相关文章

随机推荐

  • 如何在 TypeScript 中将项目推送到 [string]

    我想将项目添加到 string 但以下代码在 param push 语句处失败 EDIT declare var sqlitePlugin any var query string SELECT FROM items var param s
  • 请求位置更新的频率超过 5 秒(Android Fused 位置)

    我正在制作一个实时位置监听应用程序 我需要调用位置更新每 3 秒一次 I use Fused https developer android com google play services location html地点 我的间隔设置为
  • 具有多个条件主题的 Firebase API 调用

    我在调用 FCM API 时遇到一个悲惨的问题 简而言之 当我使用以下方式调用 API 时 URL https fcm googleapis com fcm send Content Type application json Author
  • 祖先查询解析错误

    我正在努力让我的祖先查询 https developers google com appengine docs python datastore structuring for strong consistency工作 但我不断收到此错误
  • 如何在 C# 中将 int[] 转换为 byte[]

    如何在 C 中将 int 转换为 byte 一些代码将不胜感激 EDIT 我需要一个函数来执行以下操作 byte FuncName int Input 由于您的问题中的细节很少 我只能猜测您要做什么 假设您想将 2D 整数数组 展平 为 1
  • 后台工作人员:在执行 RunWorkerCompleted 之前确保 ProgressChanged 方法已完成

    假设我正在使用后台工作者并且我有以下方法 private void bw DoWork object sender DoWorkEventArgs e finalData MyWork sender as BackgroundWorker
  • 当调用函数时,堆栈帧真的会被推入堆栈吗?

    我很长一段时间以来所学到的方法是 当我运行程序时 立即进入堆栈的第一件事是 main 方法的堆栈帧 如果我从 main 中调用一个名为 foo 的函数 那么一个堆栈帧 即局部变量 自动对象 的大小 和参数也会被推入堆栈 然而 我遇到了一些与
  • CefSharp获取页面截图

    是否可以使用以下方式获取网页的屏幕截图CefSharp 我找到了有关的信息GetImage 方法 但似乎不再支持 还有其他办法吗 我需要从屏幕外浏览器获取屏幕截图 因此制作显示浏览器的屏幕屏幕截图并不是解决方案 我已经在分叉分支中实现了此功
  • 如何在android中使用openstreetmap通过纬度和经度获取城市名称[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在我的应用程序中 我使用 osm 而不是谷歌地图 我有纬度和经度 所以从这里我将如何查询从 osm 数据库获取城市名称 请帮助我 我正在使
  • 显示一个句子,一次一个字符

    我想用 jQuery 一次一个字符地显示一个句子 有没有一个插件可以做到这一点或者我怎样才能达到这种效果 你可以写一个小插件来做到这一点 这里有一些可以帮助您入门的东西 远非完美 只是为了给您一个想法 function fn writeTe
  • 可索引类型 - TypeScript

    下面的语法 interface StringArray index number string 指出当StringArray索引为number 它将返回一个string 例如 let myArray StringArray myArray
  • 获取 JSON 格式的 JSDoc 输出

    有没有办法配置 JSDoc 使输出采用 JSON 格式而不是通常的 HMTL 格式 有一个选项 X 解释 它使用已解析的 AST 创建 JSON 文件 jsdoc X mylib gt jsdoc ast json 要理解此 JSON 您可
  • 如何更改引导程序中面板的折叠方向

    我有一个众所周知的基本可折叠面板 其代码如下所述 我通过 css 设置更改了一些属性 例如折叠和折叠高度和宽度 但无法更改折叠方向 我想将其更改为与默认位置相反的顶部 我怎样才能做到这一点 我向你保证 我尝试了多种方法 但无法解决问题 di
  • 在 numpy 中加速矢量化眼球追踪算法

    我正在尝试实现 Fabian Timm 的眼球追踪算法 http www inb uni luebeck de publikationen pdfs TiBa11b pdf http www inb uni luebeck de publi
  • 如何读取 Perl 变量的根标签和根结束标签?

    我是 Perl 新手 我想将 xml 根标记和根结束标记读取到 perl 变量 我尝试了正常的文件读取 有效 我正在得到第一行和最后一行 但有时 如果没有新的线路 您就不能相信第一条线路 使用正则表达式读取第一行就完成了 但我在 googl
  • 为 go.mod 文件指定 Go 版本

    我正在通过 Heroku 部署应用程序 我愿意git push heroku master 我收到此错误 remote Compressing source files done remote Building source remote
  • Android 的 FragmentTabs 示例中的两个框架布局 Support4Demos

    我对 Android 中的片段不熟悉 我指的是为 supportv4 兼容性库提供的片段演示示例 谁能解释一下为什么有两种框架布局 android id realtabcontent android id tabcontent Androi
  • iPad Safari 视口的高度

    iPad 的视口宽度为 980 像素 高度是多少 在 Safari 中 我们必须添加地址和新的水龙头 Safari 横向模式下的高度是多少 有一个媒体查询可以使网页适合宽度 有没有办法使网页适合高度 以下是答案 你是对的 iPhone iP
  • PostgreSQL 权限授予不可见

    在 PostgreSQL 10 上 我有一个名为tn schema和一个名为tn beta db 我认为是的 尽管我确实必须连接到相关数据库才能查看架构 T jeff nantes 4 sudo su postgres c psql psq
  • lombok对jpa有副作用吗

    我正在努力将 jpa 实体转换为使用 lombok 结果代码如下 Entity Table name TEST Data NoArgsConstructor AllArgsConstructor class Test Column name