Evite redundâncias ao definir Entities do JPA

Se você for definir uma tabela, por favor, não faça isso!

Vamos saber melhor por que!

No JPA, uma classe é mapeada para uma tabela através da anotação @Entity. Com essa anotação nós indicamos que a classe é uma entidade do JPA, nesse caso, automaticamente ele mapeia a classe para uma tabela.

Para isso, o JPA está configurado por default a resolver o nome da classe para uma tabela da seguinte forma:

1 – Classes no Java são definidas através de PascalCase.
2 – O nome da classe é convertida em snake_case.
3 – Este nome convertido é utilizado para o nome da tabela no banco de dados.

Então, através desse algoritmo:

CustomerDetails -> customer_details

Enter fullscreen mode Exit fullscreen mode

No caso do exemplo original:

Product -> product

Enter fullscreen mode Exit fullscreen mode

Só isso já conseguimos eliminar a necessidade da anotação @Table.

Conseguimos também definir o nome da tabela ao definir o nome da entidade nas queries JPQL. Isso porque o nome da tabela é resolvido através do seu nome nas queries. Primeiro, por default, é resolvido pelo nome da classe da entidade, porém podemos mudar esse nome pela anotação @Entity:

@Entity(name = "blablabla")

Enter fullscreen mode Exit fullscreen mode

Só fazendo isso, conseguimos mudar o nome da tabela que será mapeada e de quebra também o nome que iremos utilizar para as queries JPQL.

Podemos ter edge cases para definir as duas anotações, que é quando a tabela tem um nome específico, e nas queries JPQL iremos nos referir ao nome da classe mesmo, exemplo:

@Entity
@Table(name="products")
public class Product {

}

Enter fullscreen mode Exit fullscreen mode

No caso aqui, o nome da tabela está no plural, porém na query JPQL, iremos utilizar o nome da classe mesmo:

@Query("Product p where p.vendorId = :vendorId")
Product findProductFromVendor(int vendorId);

Enter fullscreen mode Exit fullscreen mode

Neste caso, a query que isso irá gera no SQL será o seguinte:

SELECT * FROM products WHERE vendor_id = 10

Enter fullscreen mode Exit fullscreen mode

Outro edge case seria se eu quisesse que o nome da entidade nas queries seja diferente do nome da classe e o nome na tabela seja diferente dos dois:

@Entity(name="prod")
@Table(name="products")
public class Product{

}

Enter fullscreen mode Exit fullscreen mode

É essencial entender o funcionamento das anotações e do framework que estamos utilizando para não cairmos em redundância desnecessária na hora de programar!

原文链接:Evite redundâncias ao definir Entities do JPA

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容