1
I am implementing Hibernate in my project and arrived at a stage where I am having problems to map my entities.
I have an entity called Book and would like to create a Stock entity to store the number of books I own, however, I would like to use the primary book key in my stock entity to ensure that each book will have only one record in the stock table.
My Book Class:
@Entity
public class Livro {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="idLivro")
    private int idLivro;
    @Column(length=70)
    private String titulo;
    @Column(columnDefinition="TEXT")
    private String descricao;
    private int edicao;
    @Temporal(TemporalType.DATE)
    private Date dataLancamento;
    private int numeroPaginas;
    private long ISBN;
    @ManyToMany
    private List<Categoria> categorias;
    @ManyToOne
    private Editora editora;
    //getters e setters
And my stock class:
@Entity
public class Estoque {
    @OneToOne(cascade=CascadeType.ALL)  
    @PrimaryKeyJoinColumn 
    private Livro livro;
    private int quantidade;
    // Getters e Setters
Meanwhile I get the message on the console:
Exception in thread "main" org.hibernate.AnnotationException: No identifier specified for entity: br.com.biblioteca.model.Estoque
    at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:266)
    at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:719)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:249)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at br.com.biblioteca.model.Main.main(Main.java:11)
What if I add the Annotation @Id :
@Entity
public class Estoque {
    @Id
    @OneToOne(cascade=CascadeType.ALL)  
    @PrimaryKeyJoinColumn 
    private Livro livro;
I get the following message on the console:
Exception in thread "main" javax.persistence.PersistenceException: Unable to build entity manager factory
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:66)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at br.com.biblioteca.model.Main.main(Main.java:11)
Caused by: java.lang.NullPointerException
    at org.hibernate.mapping.PersistentClass.createPrimaryKey(PersistentClass.java:363)
    at org.hibernate.cfg.CreateKeySecondPass.doSecondPass(CreateKeySecondPass.java:31)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1585)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    ... 3 more
I’ve tried using @id and still have problems:
– Cleiton Ribeiro