gpt4 book ai didi

java - lombok对jpa有副作用吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:30 26 4
gpt4 key购买 nike

我正在努力将 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 之前的所有内容粘贴到 google - 没有看到任何内容)

注意:

  1. 为了简洁和隐私起见,字段已重命名,似乎不相关的方面已被省略。如果某些东西看起来像打字错误,那很可能就是这样。如果您注意到什么,请告诉我,以便我解决。

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

编辑:

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

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;
}
...
}

请注意,注释仍附加到字段。现在,我不确定它是否只是我们正在使用的 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 如何做事的细节(公平地说,我很容易混淆)之后,我发现了这个小 gem :onMethod=@__({@AnnotationsHere}) .利用此功能,我想到了以下内容:

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

...
}

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

最佳答案

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

枚举:

public enum FormatType {

FIRST_TYPE, SECOND_TYPE
}

MySQL 中的表:

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

实体:

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> {
}

服务:

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();
}
}

关于java - lombok对jpa有副作用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46062927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com