Hi Alex, I agree with you, all these things you mention are definitely the benefit of lombok. But... Lombok is just a good tool which can be used well and not-so-well. If we understand what is behind the annotations then we can use it really well. Please consider my arguments below and apply the advised limitations.
Thank you, Marta > On 26 Jul 2024, at 19:36, Aleksandar Vidakovic <chee...@monkeysintown.com> > wrote: > > ... note: another motivation to put Lombok in place was to avoid all these > "creative" naming patterns. > > On Fri, Jul 26, 2024 at 7:35 PM Aleksandar Vidakovic > <chee...@monkeysintown.com <mailto:chee...@monkeysintown.com>> wrote: >> ... just wanted to mention one more: in some of the (domain) classes we have >> all sorts of typos and other "errors": some people came clearly from a PHP >> background and used snakecased naming instead of camelcased... if you put >> Lombok in those classes then it will strictly apply Java Bean standards etc. >> and things might look very weird... just to say that some of those classes >> need to be repaired anyway, Lombok or not. >> >> On Fri, Jul 26, 2024 at 7:05 PM Márta Jankovics <marta.jankov...@dpc.hu >> <mailto:marta.jankov...@dpc.hu>> wrote: >>> Hi Zeyad, >>> >>> Thank you for bringing up this topic. I did not participate in the previous >>> discussion that Alex mentioned, I just realised that entities change one >>> after other nowadays by adding lombok annotations all over fineract and I >>> must say that I do not agree with some of these changes. >>> Although I see the benefit of lombok of course in reducing the amount of >>> boilerplate code, improving readability and allowing developers to work >>> more efficiently, but I think we should consider some limitations. Lombok >>> is perfectly fine for DTOs but not for persistent entities. >>> Entities are business objects and yes they do some validations which can >>> not be done in validators - because the entity encapsulates the information >>> which is simply not visible for a validator - and also can not be done by >>> the database layer or could be but it is too late and the error message is >>> too ugly. >>> Let me bring some example: >>> - CommandSource is the representation of the audit entry which can not be >>> ever changed by anyone after it was persisted and it can not be created >>> without main audit information like entity- and action names, request url, >>> status etc. >>> I do not say it is readOnly because there is one case - the 4 eye workflow >>> - when the checker related fields can be updated later but nothing else. >>> To add a public @Builder to this entity is not correct because then someone >>> might think that it can be created without these crucial data. >>> Adding public @Setter here is also not good, because only one or two fields >>> can be set after creation. >>> Even adding a public @NoArgsConstructor is not correct because of the same >>> reason. >>> - In general @AllArgsConstructor on persistent entities can only be used if >>> we do not have to also set the fields that only the framework can set like >>> auto generated id, Auditable fields (createdAt, createdOn, updatedAt, >>> updatedOn). >>> - Other entity types where we must be really careful with public setters >>> and constructors are the link entities. For example >>> ProductToGLAccountMapping.glAccount or productId can never be updated, >>> because these fields are like identifiers. The entity can be deleted and >>> recreated but never updated on these fields. And the entity can not be >>> created without these data. >>> Of course the data layer would catch this but as I mentioned above it is >>> too late. >>> >>> So what I suggest for most of the entities (there might be be some >>> exceptions as always): >>> - I would not add public Builder, NoArgsConstructor to persistent entities >>> - non-public should be fine and even a good choice. >>> - Choose the way of initialisation: either the public constructor (for >>> simpler entities) or the static initialiser (for entities more complex), >>> but do not publish both. >>> Having static initialisation and using builder (non public) framework I >>> think it is ok. >>> - Be very careful with public Setter and annotate the fields rather than >>> the entity itself (btw OTM list properties also can not be set). >>> >>> I think it is a good practice to use lombok with JPA entities but only with >>> these limitations. What do you think? >>> >>> Cheers, >>> Marta >>> >>>> On 25 Jul 2024, at 19:20, Zeyad Nasef <zeyad.nasef....@gmail.com >>>> <mailto:zeyad.nasef....@gmail.com>> wrote: >>>> >>>> Hi everyone, >>>> >>>> I hope this message finds you well. >>>> >>>> I would like to discuss the use of the @Builder annotation for entity >>>> classes in Fineract. In a recent pull request #3984 >>>> <https://github.com/apache/fineract/pull/3984/files>, I introduced the >>>> @Builder pattern for entity creation. However, upon further discussion >>>> with @Adam Saghy <mailto:adamsa...@apache.org>, some concerns have emerged >>>> that warrant community feedback: >>>> >>>> Concerns with Using @Builder for Entities: >>>> Incompatibility with The ORM (interfere with lazy loading, entity >>>> management ...etc.) >>>> No validation or transformation enforcement when instantiating the entity. >>>> Builder pattern might be confusing and let others to set or override >>>> things that should not be. >>>> Some Proposed Solutions: >>>> Adding `@NoArgsConstructor` & `@AllArgsConstructor` for resolving the JPA >>>> issues. >>>> Implementing methods like fullEntryFrom() >>>> <https://github.com/apache/fineract/blob/develop/fineract-core/src/main/java/org/apache/fineract/commands/domain/CommandSource.java#L136> >>>> to encapsulate the creation logic, thereby enforcing validation and >>>> transformations while utilizing the builder pattern to avoid large >>>> constructors with many parameters. >>>> Limiting the builder’s access to private or package-private scope and >>>> using @Builder.Default to provide specific methods for controlled >>>> instantiation. >>>> >>>> Your input on this matter would be greatly appreciated. >>>> >>>> Best regards, >>>> Zeyad Nasef >>>