我正在将一个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
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
}
我已经回滚了龙目岛的变化,我仍然想知道是什么问题,但没有匆忙。另外,由于这个可爱的小虫子,我大约落后了4个小时,所以我可能会有点慢的反应。
子表的pk是父表的fk,如果没有lombok,一切似乎都可以工作,尽管child
类没有ID。
解决方案:
@Entity
@Table(name = "TEST")
@Setter
@Getter
class Test {
...
@Column(name = "FORMATTING")
@Enumerated(EnumType.ORDINAL)
private FormatType formatType;
...
}
@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;
}
...
}
@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;
}
...
}
在经历了大量的困惑之后,我试图找到一些示例,并填写一些关于龙目岛是如何执行其操作的细节(平心而论,我很容易感到困惑),我发现了这个小宝石: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();
}
}
我在gradle项目中使用lombok,希望创建一个jar文件,但每次我执行jar任务(无论是在控制台还是eclipse ide中触发)时,我都会发现错误,我的lombok导入在我使用lombok注释的类中找不到。输出示例: 搜索了一段时间后,我发现有一个适用于gradle和lombok的插件,但在使用较新的gradle版本编译时并不真正需要。我的gradle版本是3.4.1和lombok 1.6
我今天遇到了lombok。 我非常想知道它是如何工作的。 一篇Java Geek的文章给出了一些线索,但对我来说并不是很清楚: Java6删除了apt,使javac能够管理注释,简化了流程,以获得更简单的单步计算。这是龙目岛所走的路。 在Java6中,编译过程可能是:javac->apt->lombok apt process->使用ASM读取类文件并添加set/get方法? 你能给我看更多有关机
问题内容: 我有一堂课,看起来像这样: 在这里,我不得不写a,因为如果我想在使用Lombok时返回Optional,则必须声明为。这将生成一个接受的生成器方法! 还有其他方法可以使用lombok 吗? 问题答案: 答案是否定的,可能永远也不会。 您可能做错了:-) 并不是预防的替代品,也不是预防的奇特方法。这表示该问题无法回答,例如:空人员列表的平均年龄是多少。 绝对不应传递,而应尽快由调用代码取
我有一个名为Address的类,如下所示: 在这里,我不得不编写生成器和Getter,因为如果我想在使用Lombok时返回一个Optional,我必须将第2行声明为Optional 是否有其他方法可以将lombok与
我试着在IntelliJ上使用Lombok和Maven和VRaptor,但它不起作用。 我已经在stackoverflow中阅读了一些信息,但没有解决我的问题,我已经在Intellij中启用了注释处理器,但仍然一无所获。 我也试图从命令行(Windows)编译它,但没有成功。 我还尝试在没有maven的情况下创建另一个项目,添加库,创建一些用于测试的类,它可以完美地工作、编译和运行。 有什么帮助吗
我在Intellij遇到了一个奇怪的问题。我正在使用Lombok(1.18.2)、IntelliJ(2018.2.2)和JUnit 5在gradle 4多模块项目中。 我花了好几个小时来复制这个。 > 运行所有具有覆盖率测试用例。 移除龙目镜并在此之后生成吸气剂和定型剂也没有效果。 尝试了一切来解决这个问题(启用注释处理器、Lombok插件、清理构建),但没有成功。 编辑1: Root build