Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is the JPA @Embedded annotation mandatory?

I have tried omitting the @Embedded annotation and still the fields have been embedded in the table. I cannot find anything which would say that the @Embedded annotation is optional.

Is it or is it not optional?

The following code

@Embeddable
public class Address {
    String city;
    String street;
}

@Entity
public class Person {
    String name;
    @Embedded // it seems that it works even if this annotation is missing!?
    Address address;
}

generates always the same table

person
    name
    city
    street

even if I do not specify @Embedded.


My configuration:

  • JBoss EAP 6.4.0
  • hibernate-jpa-2.0-api-1.0.1.Final-redhat-3.jar

The JPA specification says:

http://docs.oracle.com/javaee/7/api/javax/persistence/Embedded.html

@javax.persistence.Embedded

Specifies a persistent field or property of an entity whose value is an instance of an embeddable class. The embeddable class must be annotated as Embeddable.

http://docs.oracle.com/javaee/7/api/javax/persistence/Embeddable.html

@javax.persistence.Embeddable

Specifies a class whose instances are stored as an intrinsic part of an owning entity and share the identity of the entity. Each of the persistent properties or fields of the embedded object is mapped to the database table for the entity.

like image 529
Honza Zidek Avatar asked Jul 01 '15 09:07

Honza Zidek


People also ask

What is @embedded annotation?

4. @Embedded. The JPA annotation @Embedded is used to embed a type into another entity.

Which of the following two are the mandatory annotations on a JPA entity?

The JPA specification requires the @Entity annotation. It identifies a class as an entity class. You can use the name attribute of the @Entity annotation to define the name of the entity. It has to be unique for the persistence unit, and you use it to reference the entity in your JPQL queries.

What is @embedded in spring?

We represent a composite primary key in Spring Data by using the @Embeddable annotation on a class. This key is then embedded in the table's corresponding entity class as the composite primary key by using the @EmbeddedId annotation on a field of the @Embeddable type.

Why do we use @entity annotation?

@Entity annotation defines that a class can be mapped to a table. And that is it, it is just a marker, like for example Serializable interface.


1 Answers

In case of using Hibernate it does not matter if you annotate the field itself (as @Embedded) or if you annotate the referenced class (as @Embeddable). At least one of both is needed to let Hibernate determine the type.

And there is a (implicit) statement about this inside the Hibernate documentation, take a look here: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-component

It says:

The Person entity has two component properties, homeAddress and bornIn. homeAddress property has not been annotated, but Hibernate will guess that it is a persistent component by looking for the @Embeddable annotation in the Address class.

like image 101
Kevin Peters Avatar answered Oct 16 '22 08:10

Kevin Peters