@embedded注释有什么影响?

时间:2011-10-05 16:24:12

标签: java hibernate jpa

嵌入式注释如何影响数据库?

SQL查询需要如何更改?

使用注释的典型用例是什么?

5 个答案:

答案 0 :(得分:18)

  

嵌入式注释如何影响数据库?

它根本不会影响它。在ORM提供程序层上,嵌入实体的所有字段都与父实体合并,并且处理方式与在那里始终声明它们一样。换句话说,就像你将所有字段,getter和setter字面复制到包含嵌入对象的实体一样。

  

SQL查询需要如何更改?

他们不会。你不需要改变任何东西。见上文。

  

使用注释注释的典型情况是什么?

有时你会有一个包含多个列的巨大表(特别是遗留数据库)。但是,某些列在逻辑上相互关联(如CUSTOMER表中的街道,城市和电话号码)。如果您不想创建包含所有字段的对象,则可以创建嵌入的Address对象。这样,您可以在逻辑上将地址列分组到对象中,而不是使用具有平坦字段列表的同样巨大的POJO。

使用嵌入式对象被认为是一种很好的做法,尤其是在发现强1-1关系时。

答案 1 :(得分:2)

扩展@ Tomasz Nurkiewicz的答案嵌入对象对于使用注释@EmbenddedId

的复合主键whit帮助映射表非常有用

答案 2 :(得分:1)

  

使用注释的典型用例是什么?

这通常表示复合主键为可嵌入类:

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



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

主键字段在可嵌入类中定义。该实体包含一个主键字段,该字段使用@EmbeddedId进行批注,并包含该可嵌入类的实例。使用此表单时,未定义单独的ID类,因为可嵌入类本身可以表示完整的主键值。

  

嵌入式注释如何影响数据库?

没有。使用此批注表示复合主键。

  

SQL查询需要如何更改?

他们赢了。

答案 3 :(得分:1)

就像托马斯说 - 那是一个目标 - 另一个 - 你可以" snaphot"表中其他相关实体的状态。 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;
}

在此示例中 - 没有嵌入式和@AttributeOverrides公司客户未来的任何更改都将更改发票中的数据 - 这是一个错误 - 为具有旧数据的公司生成发票。

这里解释得很好::) Java - JPA @Basic and @Embedded annotations

答案 4 :(得分:0)

它并不总是必须是班级的ID。在域驱动设计中,您可以从对象的某些属性中创建component,例如在此示例http://yaarunmulle.com/hibernate/hibernate-example/hibernate-mapping-component-using-annotations-1.html中,学生有一个地址组件。

Student的Address属性使用@Embedded注释,指向Address类组件。