bhuwan agrawal
bhuwan agrawal

Reputation: 5

Can we use @autowired anotation with @oneToone

Getting Error while injecting User1 Bean into Order1 class I am using @autowire with @onetoMany is it allowed? I have added Order1.java,User1.java,pom.xml and error

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.3.jar:2.7.3] at com.simplilearn.mediCare.MedicareApplication.main(MedicareApplication.java:17) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.7.3.jar:2.7.3] Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.22.jar:5.3.22] ... 21 common frames omitted Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:181) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:319) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.22.jar:5.3.22] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.22.jar:5.3.22] ... 25 common frames omitted Caused by: org.hibernate.InstantiationException: could not instantiate test object : com.simplilearn.mediCare.entities.Order1 at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:43) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.engine.internal.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:68) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.tuple.PropertyFactory.buildIdentifierAttribute(PropertyFactory.java:65) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:142) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:613) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:126) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na] at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] ... 33 common frames omitted Caused by: java.lang.reflect.InvocationTargetException: null at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na] at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:40) ~[hibernate-core-5.6.10.Final.jar:5.6.10.Final] ... 44 common frames omitted Caused by: java.lang.NullPointerException: Cannot invoke "com.simplilearn.mediCare.user.User1.getCart()" because "this.user1" is null at com.simplilearn.mediCare.entities.Order1.(Order1.java:54) ~[classes/:na] ... 50 common frames omitted Order1.java

        package com.simplilearn.mediCare.entities;
           import java.time.LocalDateTime;
           import java.util.ArrayList;
           import java.util.HashSet;
           import java.util.List;
           import java.util.Set;
           import javax.persistence.CascadeType;
           import javax.persistence.Entity;
           import javax.persistence.GeneratedValue;
           import javax.persistence.GenerationType;
           import javax.persistence.Id;
           import javax.persistence.OneToMany;
           import javax.persistence.OneToOne;
           import javax.persistence.Transient;
        
           import org.hibernate.annotations.UpdateTimestamp;
           import       org.springframework.beans.factory.annotation.Autowired;
           import org.springframework.context.annotation.Scope;
           import org.springframework.data.util.Pair;
           import org.springframework.stereotype.Component;
        
           import com.simplilearn.mediCare.config.ConfigBean;
           import com.simplilearn.mediCare.repositories.CartRepo;
           import com.simplilearn.mediCare.user.User1;
        
           import lombok.Data;
           import lombok.EqualsAndHashCode;
           import lombok.NoArgsConstructor;
           @Component
           @Scope("prototype")
           @Entity
           @Data
           @NoArgsConstructor
           public class Order1 {
            
                
            @Autowired
            @Transient
            CartRepo cartRepo;
            
            @Id
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            private long id;
            
            
            @Autowired
            @OneToOne
            private User1 user1;
        
            
            @OneToMany
            private Set<ProductAndQty> 
            productsAndQty=this.user1.getCart().getProductsAndQty();
            
            @UpdateTimestamp
            private LocalDateTime orderTimeStamp;
            
            @OneToMany(cascade = CascadeType.ALL)
            List<Status> orderStatus=new ArrayList<>();
            
            public Order1(String Statusmsg,Cart cart){
                Status status=new Status();
                status.setStatusMsg(Statusmsg);
                this.orderStatus.add(status);
                this.productsAndQty=cart.getProductsAndQty();
                Set<ProductAndQty> productsAndQty1=new HashSet<>();
                cart.setProductsAndQty(productsAndQty1);
                cartRepo.save(cart);
                }
            
            private long totalPrice=calculateTotalPrice();
        
            public long calculateTotalPrice() {
                this.totalPrice=0l;
                productsAndQty.forEach(pAndq->this.totalPrice+= 
             (pAndq.getQty()*pAndq.getProduct().getPrice()));
                return totalPrice;
               }
            }
    ```
    *User1.java*
    ```
            package com.simplilearn.mediCare.user;
         
            import javax.persistence.CascadeType;
            import javax.persistence.Entity;
            import javax.persistence.GeneratedValue;
            import javax.persistence.GenerationType;
            import javax.persistence.Id;
            import javax.persistence.OneToOne; 
            import javax.validation.constraints.Email;
        
            import org.springframework.stereotype.Component;
        
            import com.fasterxml.jackson.annotation.JsonIgnore;
            import com.simplilearn.mediCare.entities.Cart;
        
            import lombok.AllArgsConstructor;
            import lombok.Data;
            import lombok.NoArgsConstructor;
            import lombok.ToString;
        
        
            @Data
            @Component
            @Entity
            @NoArgsConstructor
            @ToString
            public class User1 {
        
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private long id;
            String name;
            @Email
            String email;
            @JsonIgnore
            String Password;
            String role;
        
            @OneToOne
            Cart cart=new Cart();
        
        //  public User1(UserPayload userPayload){
        //  this.name=userPayload.getName();
        //  this.email=userPayload.getEmail();
        //  this.Password=userPayload.getPassword();
        //  this.role=userPayload.getRole();
        //  this.cart=new Cart();
        //}
        //  public User1() {
        //      UserPayload userPayload=new UserPayload();
        //      this.name=userPayload.getName();
        //      this.email=userPayload.getEmail();
        //      this.Password=userPayload.getPassword();
        //      this.role=userPayload.getRole();
        //      this.cart=new Cart();
        //  }
        //  
        }

pom.xml

        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.7.3</version>
                <relativePath /> <!-- lookup parent from repository -->
            </parent>
            <groupId>com.simplilearn.Medicare</groupId>
            <artifactId>com.spring</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <name>Medicare</name>
            <description>Medicare project for phase 5</description>
            <properties>
                <java.version>17</java.version>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-validation</artifactId>
                </dependency>
                <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
                <dependency>
                    <groupId>javax.xml.bind</groupId>
                    <artifactId>jaxb-api</artifactId>
                    <version>2.3.1</version>
                </dependency>
        
                <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
                <dependency>
                    <groupId>org.javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>3.17.1-ga</version>
                </dependency>
        
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
        
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-devtools</artifactId>
                    <scope>runtime</scope>
                    <optional>true</optional>
                </dependency>
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <scope>runtime</scope>
                </dependency>
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <optional>true</optional>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-test</artifactId>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-hateoas</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springdoc</groupId>
                    <artifactId>springdoc-openapi-ui</artifactId>
                    <version>1.6.4</version>
                </dependency>
                <dependency>
                    <groupId>org.springdoc</groupId>
                    <artifactId>springdoc-openapi-webflux-ui</artifactId>
                    <version>1.6.4</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                </dependency>
            </dependencies>
        
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <configuration>
                            <excludes>
                                <exclude>
                                    <groupId>org.projectlombok</groupId>
                                    <artifactId>lombok</artifactId>
                                </exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        
        </project>
    ```



Upvotes: 0

Views: 191

Answers (2)

Yury Bohdan
Yury Bohdan

Reputation: 1

For what you need to @Autowire in Entity? I think it's bad. It's just ok to use @OneToOne(and use @Autowire somewhere else in Service/Repository/Controller), additionally you can create conctrucrot(in this class for User1) if you need so.

Upvotes: 0

Nouman Ahmed
Nouman Ahmed

Reputation: 110

I believe your approach of autowiring the model entities is wrong. There is a layering approach which is mostly followed in spring.

Controller -> Service -> Repository -> Model(Entity) -> Data Source

So I'll suggest not to autowire anything in models because when spring data jpa will bring data from database and desearialize it then he should create new object for relations and provide you in java code. In this case when you are autowiring the models in each other then in multithreaded environment it will break when multiple users are interacting with your application.

Upvotes: 0

Related Questions