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

Reply via email to