Long ou long

Oi pessoal.
Hoje eu vi em uma apostila de hibernate a seguinte pergunta : Por que utilizamos o Long e não o long para o campo id ?
Essa pergunta estava abaixo de uma classe que foi mapeada para uma tabela. O atributio id estava como private Long id;
Eu pensei que Long e long desse na mesma não é?

Acho que é por causa que Long por ser uma classe aceita valores null por exemplo

[code]Long i = null; //é válido

long i = null; //inválido vai dar erro[/code]

Long é um objeto igual a String, Boolean, Integer

long é um tipo primitivo igual a int, boolean e etc

Como o Ivan disse … Se na sua base de dados a coluna mapeada para o id pode conter valores nulos, então o mapeamento deve ser feito para Objeto não para os tipos primitivos, se não acabará recebendo um erro …

[]'s

Oi!

Long é um Wrapper (Objeto), enquanto long é um tipo primitivo, como já foi dito.
Só estou postando aqui, porque eu sempre usei e vi usar o ID de uma tabela como chave primária.
Sendo assim, dizer que uma chave primária é “Nula”, é no minimo estranho!

Eu entendo que quando geramos um registro geramos uma chave primária, já pensou gerar um registro cuja chave primária é nula?
Portanto, eu sempre dei valores primitivos ao ID, long, porque possui 64 bits.

Bom, está dada a opinião.
Abraços.

[quote=nel]Oi!

Long é um Wrapper (Objeto), enquanto long é um tipo primitivo, como já foi dito.
Só estou postando aqui, porque eu sempre usei e vi usar o ID de uma tabela como chave primária.
Sendo assim, dizer que uma chave primária é “Nula”, é no minimo estranho!

Eu entendo que quando geramos um registro geramos uma chave primária, já pensou gerar um registro cuja chave primária é nula?
Portanto, eu sempre dei valores primitivos ao ID, long, porque possui 64 bits.

Bom, está dada a opinião.
Abraços.[/quote]

Com certeza.
Quando falei de ID estava falando do atributo … que também geralmente é mapeado para a PK da tabela …
mas o nome do atributo pode referenciar qualquer coluna … mesmo sendo estranho … enfim …
Mas a idéia é para qualquer coluna/atributo, não necessáriamente o id/PK …

Desculpe, acho que me expressei mal … A ideia é que uma coluna da tabela que aceite valores nulos, deve ser mapeada para um Wrapper …

[]'s

Ja se perguntou porque String é com “S” e nao “s”??
Talvez porque as Strings do java, sejam um vetor de Chars… esse é minha tese. Toda variavel… respeita a regra de ser minusculo.
Ex: nomeDaVariavel

porque String é uma classe e classes iniciam seu nome com letra maiuscula por padrão.
Abraço

Por padrão no Hibernate eu sempreusei tipo Wrapper, principalmente por causa da possibilidade do uso de null e tambem de recusos que os tipos dão como parses, opção de ver a instancia essa coisas.
Agora se há uma convenção no mapeamento de classes de entidade no Hibernate, realmente nunca me apeguei a esse detalhe. Será que alguem ja viu ?

Alias que interessante, na apostila da Caellum do curso -fj28, pagina 16 é sugerida essa discussão
a Pergunta é por que utilizamos o Long e não o long para o campo id. (So que neste caso este questionamento é referente aocodigo abaixo)

@Entity
public class Produto {
    @Id @GeneratedValue
    private Long id;
    private String nome;
    private String descricao;
    private Double preco;
   // getter e setters
}

o Long pode receber um null (:

[quote=nel]Oi!

Long é um Wrapper (Objeto), enquanto long é um tipo primitivo, como já foi dito.
Só estou postando aqui, porque eu sempre usei e vi usar o ID de uma tabela como chave primária.
Sendo assim, dizer que uma chave primária é “Nula”, é no minimo estranho!

Eu entendo que quando geramos um registro geramos uma chave primária, já pensou gerar um registro cuja chave primária é nula?
Portanto, eu sempre dei valores primitivos ao ID, long, porque possui 64 bits.

Bom, está dada a opinião.
Abraços.[/quote]

Se a chave for gerada automaticamente no banco (por meio de uma sequência por exemplo) haverá um momento onde o id da entidade é nulo. Quando você cria a entidade, mas ainda não a persistiu. Por isso o uso de Long e não de long num atributo que será mapeado para pk.

Falou.

[quote=wagnerfrancisco][quote=nel]Oi!

Long é um Wrapper (Objeto), enquanto long é um tipo primitivo, como já foi dito.
Só estou postando aqui, porque eu sempre usei e vi usar o ID de uma tabela como chave primária.
Sendo assim, dizer que uma chave primária é “Nula”, é no minimo estranho!

Eu entendo que quando geramos um registro geramos uma chave primária, já pensou gerar um registro cuja chave primária é nula?
Portanto, eu sempre dei valores primitivos ao ID, long, porque possui 64 bits.

Bom, está dada a opinião.
Abraços.[/quote]

Se a chave for gerada automaticamente no banco (por meio de uma sequência por exemplo) haverá um momento onde o id da entidade é nulo. Quando você cria a entidade, mas ainda não a persistiu. Por isso o uso de Long e não de long num atributo que será mapeado para pk.

Falou.[/quote]

De qualquer forma o valor não foi persistido em banco, portanto, se é nulo ou 0, não faz diferença para esse caso.
Em particular, a maioria das database tem uma PK gerada automaticamente, o que evitaria um nulo. Só me refiro que o long evitaria uma falha do banco, por exemplo, em por algum motivo persistir um nulo como PK, onde seria persistido um 0.

Apenas isso.

[quote=nel][quote=wagnerfrancisco][quote=nel]Oi!

Long é um Wrapper (Objeto), enquanto long é um tipo primitivo, como já foi dito.
Só estou postando aqui, porque eu sempre usei e vi usar o ID de uma tabela como chave primária.
Sendo assim, dizer que uma chave primária é “Nula”, é no minimo estranho!

Eu entendo que quando geramos um registro geramos uma chave primária, já pensou gerar um registro cuja chave primária é nula?
Portanto, eu sempre dei valores primitivos ao ID, long, porque possui 64 bits.

Bom, está dada a opinião.
Abraços.[/quote]

Se a chave for gerada automaticamente no banco (por meio de uma sequência por exemplo) haverá um momento onde o id da entidade é nulo. Quando você cria a entidade, mas ainda não a persistiu. Por isso o uso de Long e não de long num atributo que será mapeado para pk.

Falou.[/quote]

De qualquer forma o valor não foi persistido em banco, portanto, se é nulo ou 0, não faz diferença para esse caso.
Em particular, a maioria das database tem uma PK gerada automaticamente, o que evitaria um nulo. Só me refiro que o long evitaria uma falha do banco, por exemplo, em por algum motivo persistir um nulo como PK, onde seria persistido um 0.

Apenas isso.[/quote]

Eu acho que faz diferença sim. Se você executar uma operaçao saveOrUpdate ou merge e a entidade estiver com o id igual a zero ao invés de nulo, eu acredito que o Hibernate vai tentar fazer um update na entidade mesmo quando você acabou de criá-la, já que ele vai usar o Id pra saber qual operaçao realizar (salvar ou atualizar).

Se você estiver usando um wrapper no id e ele for nulo, o Hibernate vai entender que deve executar uma operaçao de Insert e o banco se encarregará de fornecer um novo valor para o id, não vejo problema com possíveis falhas no banco nesse caso.

E ainda deve-se ressaltar que 0 pode ser um id válido no teu banco.

Abraço.

De qualquer forma vejo que é bem possível que tenha de haver um tratamento no método de persistência.
Você pode passar um ID nulo quando na realidade estava querendo atualizar a entidade e não inserir, sendo que o mesmo é verdade para um ID 0.

Mas sem problemas, eu apenas não gosto de pensar na possibilidade de haver uma inserção de um valor nulo na database, mesmo que o 0 possa vir a ser um ID válido. Se for o caso, há algo de errado na implementação.

Abraços.

[quote=nel]De qualquer forma vejo que é bem possível que tenha de haver um tratamento no método de persistência.
Você pode passar um ID nulo quando na realidade estava querendo atualizar a entidade e não inserir, sendo que o mesmo é verdade para um ID 0.

Mas sem problemas, eu apenas não gosto de pensar na possibilidade de haver uma inserção de um valor nulo na database, mesmo que o 0 possa vir a ser um ID válido. Se for o caso, há algo de errado na implementação.

Abraços.[/quote]

Oi nel. Eu entendo sua preocupação, mas o Hibernate já resolve isso. Se for nulo, ele insere, se não for, atualiza (quando a chave é gerada automaticamente). Se você mandar uma entidade com id nulo ser atualizada, algo está errado na implementação, afinal, com Hibernate isso não deveria acontecer.

Abraço.