What impact does the @embedded annotation mean?

2020-05-21 07:49发布

How does the Embedded annotation affect the database?

How will SQL queries need to change?

What's the typical usecase for using the annotation?

5条回答
疯言疯语
2楼-- · 2020-05-21 07:53

What's the typical usecase for using the annotation?

This is typically to represent a composite primary key as an embeddable class:

@Entity
public class Project {
    @EmbeddedId ProjectId id;
     :
}



@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

The primary key fields are defined in an embeddable class. The entity contains a single primary key field that is annotated with @EmbeddedId and contains an instance of that embeddable class. When using this form a separate ID class is not defined because the embeddable class itself can represent complete primary key values.

How does the Embedded annotation affect the database?

It does not. Use this annotation to represent a composite primary key.

How will SQL queries need to change?

They won't.

查看更多
Emotional °昔
3楼-- · 2020-05-21 07:57

Like Tomasz said - that's the one goal - the other - you can "snaphot" the state of other related entity inside your table. F.e.

@Embeddable public class Company {
    String name;
    String streetName;
    String city;
}



@Entity public class Invoice {

    @Embedded 
    @AttributeOverrides({
        @AttributeOverride(name="name", column=@Column(name="name")),
        @AttributeOverride(name="streetName", column=@Column(name="streetName")),
        @AttributeOverride(name="city", column=@Column(name="city")),
    })            
    Company seller;

    @Embedded 
    @AttributeOverrides({
        @AttributeOverride(name="name", column=@Column(name="name")),
        @AttributeOverride(name="streetName", column=@Column(name="streetName")),
        @AttributeOverride(name="city", column=@Column(name="city")),
    })        
    Company customer;
}

in this example - without embedded and @AttributeOverrides any change in future of Company customer will change the data in Invoice - which is a bug - the invoice was generated for the company with old data.

It's good explained here: :) Java - JPA @Basic and @Embedded annotations

查看更多
Summer. ? 凉城
4楼-- · 2020-05-21 07:59

How does Embedded annotation affect the database?

It does not affect it at all. On ORM provider layer all fields from embedded entity are merged with parent entity and treated the same as if they were declared there all the time. In other words it works as if you would literally copy all the fields, getters and setters into the entity that contains embedded object.

How will SQL queries need to change?

They won't. You don't need to change anything. See above.

What's the typical case for using the annotation annotation?

Sometimes you have a huge table with several columns (especially with legacy databases). However some columns are logically tied to each other (like street, city and phone number in CUSTOMER table). When you don't want to create an object with all the fields, you create an embedded Address object. This way you logically group address columns into an object instead of having equally huge POJO with a flat list of fields.

Using embedded objects is considered a good practice, especially when strong 1-1 relationship is discovered.

查看更多
家丑人穷心不美
5楼-- · 2020-05-21 08:16

extending the answer of @Tomasz Nurkiewicz Embedded objects are useful to mapping a table's with a composite primary key whit help of the annotation @EmbenddedId

查看更多
仙女界的扛把子
6楼-- · 2020-05-21 08:16

It doesn't always have to be the ID of the class. In Domain Driven Design, you can create a component out of some of the properties of an object, e.g. in this example http://yaarunmulle.com/hibernate/hibernate-example/hibernate-mapping-component-using-annotations-1.html a student has an address component.

The Address property of Student is annotated with @Embedded to point to the Address class component.

查看更多
登录 后发表回答