I am using the following:
@Entity
@Data
@Builder
@NoArgsConstructor(force = true)
public class User {
private String id;
private String firstName;
private String lastName;
}
what I want to achieve: for JPA usage, I need a POJO with noArgConstructor, getters/setters and equals/hashCode/toString.
For instance creation (for example in tests) I want to use User.builder().build();
Problem: it does not compile, there seems to be an issue with the NoArgConstructor vs. RequiredFieldsConstructor:
Error:(15, 1) java: constructor User in class x.y.z.User cannot be applied to given types;
required: no arguments
found: java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String
reason: actual and formal argument lists differ in length
Update: The error occurs when I try to create a new entity via new ... the builder() works.
What do I miss? Isn't it possible to use @Data, @Entity and @Builder at the same time?
try this code with lombok version 1.16.18 over :
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class User {
private String id;
private String firstName;
private String lastName;
}
Beware of that data objects aren't entities! Simply put, there is problem with hashcode/equals (when it considers id fields) and also toString method with lazy loaded parts of entity. For reference you can check Vlad Mihalceas article.
You should:
- exclude id fields from hashcode/equals
- exclude association fields which are not managed in given entity from hashcode/equals
- exclude all lazy loaded fields from toString method
- exclude fields possibly causing circular references from toString method
For sure read at least something on topic of how does JPA do "dirty checking" before beeing confident that your handwritten or generated equals/hashcode method is ok.
In the Lombok documentation it is written: Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
Do you use this syntax for your purpose? According to your description it's not the case, and could explain the error you get?
I will answer my own question by summerizing the comments.
First of all, thanks to @RoelSpilker, you can use Builder and Data together on one Pojo if you explicitly provide AllArgs- and NoArgs- constructors:
@RequiredArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Person {...}
But: the builder created for this class will not know any inherited fields. For my use case (having some AbstractEntities) this renders the solution useless and I will stick with manual helpers/builders for now.
来源:https://stackoverflow.com/questions/40516058/using-lomboks-data-and-builder-on-entity