Home > database >  Creating an entity with a ManyToOne annotation
Creating an entity with a ManyToOne annotation

Time:06-16

I'm creating an entity which has a ManyToOne relation to another one, it being multiple customers can belong to one company. Now I have my Customer entity defined as follows:

@Entity
@Table(name = "Customers")
data class Customer(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var customerId: Long? = null,
    var firstName: String,
    var lastName: String,
    var gender: String,
    @Column(insertable = false, updatable = false)
    var companyId: Long,
    @ManyToOne(targetEntity = Company::class, fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId", referencedColumnName = "companyId")
    var company: Company? = null,
    var profilePicture: String,
    var email: String,
    var phone: String,
    var birthDay: String,
    var bio: String,
    var notifyByPhone: Boolean,
    var notifyByEmail: Boolean,
    var notifyBySms: Boolean,
    @UpdateTimestamp
    var updatedAt: LocalDateTime,
    @CreationTimestamp
    var createdAt: LocalDateTime
)

I use the following function from CustomerResource as an endpoint to persist the Customer:

    @Transactional
    @POST
    fun post(@Valid entity: Customer): Response = try {
        repository.persist(entity)
        created(entity)
    } catch (exc: Exception) {
        serverError(exc)
    }

Using Postman, I use the following JSON object to fire a request to the endpoint:

{
    "firstName": "Ricardo",
    "lastName": "de Vries",
    "gender": "male",
    "companyId": "200",
    "profilePicture": "test",
    "email": "[email protected]",
    "phone": "0612536263",
    "birthDay": "28-12-1995",
    "bio": "Nothing",
    "notifyByPhone": true,
    "notifyByEmail": true,
    "notifyBySms": true
}

I have a property called "company" which is being mapped to the Company the user belongs to, based on the companyId. I have a separate companyId field which is being mapped to the companyId field in the database.

When I want to create a new Customer, I'm including the companyId in the request. This succeeds and the Customer is being successfully created.

Now when I try to fetch that specific customer, I get the following

error: "org.hibernate.PropertyAccessException: Null value was assigned to a property [class org.acme.domains.core.models.entities.Customer.companyId] of primitive type setter of org.acme.domains.core.models.entities.Customer.companyId".

I don't really get why this error occurs. I would think that the Company which belongs to the Customer gets added afterwards whenever I fetch a specific Customer.

Does anybody know how to be able to add an entity this way?

CodePudding user response:

Do you have the proper getter and setters generated? It seems like the first request is failing to set the fields properly. I suggest you put a breakpoint to the controller that creates your customer and check if the field is being set like it should. Maybe you are passing the data in a wrong format etc. I can't say that from this information but you should debug that.

You can also put @NotNull validation on your fields to see if it fails to be set in object creation.

CodePudding user response:

You have mapped companyId as not insertable and not updatable, so it won't appear in the query.

Try change it to:

@Column(insertable = true, updatable = true)
Long companyId

What's happening, I think, it's that Hibernate ORM is creating the insert query with all the other values, except for this one. I would recommend enabling the log to check. You can do it in the configuration by setting:

hibernate.show_sql = true
hibernate.format_sql = true
  • Related