嵌入式注释如何影响数据库?
SQL查询需要如何更改?
使用注释的典型用例是什么?
答案 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类组件。