当前位置: 首页 > 面试题库 >

了解Hibernate中的mappingBy批注

施子民
2023-03-14
问题内容

我试图了解JPA mappedBy@OneToMany注释的属性。我在下面的示例中创建了一个客户具有订单列表的示例:

@Entity
public class Customer {
   @Id @GeneratedValue public Integer getId() { return id; }
   public void setId(Integer id) { this.id = id; }
   private Integer id;

   @OneToMany(mappedBy="customer")
   @OrderColumn(name="orders_index")
   public List<Order> getOrders() { return orders; }
   public void setOrders(List<Order> orders) { this.orders = orders; }
   private List<Order> orders;
}

@Entity
@Table(name="TBL_ORDER")
public class Order {
   @Id @GeneratedValue public Integer getId() { return id; }
   public void setId(Integer id) { this.id = id; }
   private Integer id;

   public int getOrderNumber() { return orderNumber; }
   public void setOrderNumber(int orderNumber) { this.orderNumber = orderNumber; }
   private int orderNumber;

   @ManyToOne
   public Customer getCustomer() { return customer; }
   public void setCustomer(Customer customer) { this.customer = customer; }
   private Customer customer;
}

现在,当我使用Hibernate生成表时,我看到Hibernate仅创建了2个表:

Hibernate: create table Customer (id number(10,0) not null, primary key (id))
Hibernate: create table TBL_ORDER (id number(10,0) not null, orderNumber number(10,0) not null, customer_id number(10,0), orders_index number(10,0), primary key (id))
Hibernate: alter table TBL_ORDER add constraint FK_nt24krtgqwcsynosqgk4jkvfv foreign key (customer_id) references Customer

另外,如果我尝试保存客户和一些订单,我会在下面看到由Hibernate生成的DML语句:

Hibernate: insert into Customer (id) values (?)
Hibernate: insert into TBL_ORDER (customer_id, orderNumber, id) values (?, ?, ?)
Hibernate: update TBL_ORDER set orders_index=? where id=?

为什么Hibernate试图在TBL_ORDER中插入和更新记录,而不仅仅是运行单个插入查询?

现在,如果我删除mapledBy属性并尝试生成表,这次将看到3个表:

Hibernate: create table Customer (id number(10,0) not null, primary key (id))
Hibernate: create table Customer_TBL_ORDER (Customer_id number(10,0) not null, orders_id number(10,0) not null, orders_index number(10,0) not null, primary key (Customer_id, orders_index))
Hibernate: create table TBL_ORDER (id number(10,0) not null, orderNumber number(10,0) not null, customer_id number(10,0), primary key (id))
Hibernate: alter table Customer_TBL_ORDER add constraint UK_sw94jktvh72tripj876s31052  unique (orders_id)
Hibernate: alter table Customer_TBL_ORDER add constraint FK_sw94jktvh72tripj876s31052 foreign key (orders_id) references TBL_ORDER
Hibernate: alter table Customer_TBL_ORDER add constraint FK_f03up2h945cg0dcbo2pdb1d3c foreign key (Customer_id) references Customer
Hibernate: alter table TBL_ORDER add constraint FK_nt24krtgqwcsynosqgk4jkvfv foreign key (customer_id) references Customer

在这种情况下,为什么hibernate会创建一个附加表?mappingBy属性如何控制它?为什么我们在Customer_TBL_ORDER表的orders_id列上有一个附加的唯一键约束?

现在,如果我尝试保存客户及其订单,我将获得以下DML操作:

Hibernate: insert into Customer (id) values (?)
Hibernate: insert into TBL_ORDER (customer_id, orderNumber, id) values (?, ?, ?)
Hibernate: insert into Customer_TBL_ORDER (Customer_id, orders_index, orders_id) values (?, ?, ?)

与我声明了appedBy属性的情况相比,为什么在这种情况下我们没有额外的更新查询?


问题答案:

那很正常

使用mappedBy,您可以直接告诉Hibernate / JPA一个表拥有该关系,因此将其存储为该表的一列。

如果没有,则该关系是外部的,并且Hibernate / JPA需要创建另一个表来存储该关系。

例:

  • 一个stackoverflow Question有几个Answer
  • 一个Answer人只有一个人拥有Question

在纯JDBC中,您将创建两个表:

Questions(Question_ID, ...);
Answers(Answer_ID, Question_ID, ...);

Question_ID外键引用在哪里Question.Question_ID

至于另一种情况,我没有一个真实的案例,因为几乎每一次 都有唯一的约束 (例如:a
Question可能有多个Answer,并且Answer可能在物理上有多个Question,但对于任何一个都只出现一次Question)。



 类似资料:
  • 问题内容: 从官方的hibernate文档中: @ org.hibernate.annotations.Type会覆盖所使用的默认hibernate类型:由于Hibernate可以正确推断出该类型,因此通常不必这样做 文档中有一个示例: 我不明白 我们声明,但是方法的返回值具有类型。 我希望在类型注释中声明的类型和返回值的类型应该是相同的类型。 有人无法解释在注解中声明的类型的实际用途。为什么它与

  • 本文向大家介绍快速了解Hibernate中的Session,包括了快速了解Hibernate中的Session的使用技巧和注意事项,需要的朋友参考一下 Hibernate中的Session是一级缓存,可以理解为进程级(是线程吧)的缓存,在进程(是线程吧)运行期间一直存在。 session可以理解为一个可以操作数据库的对象,该对象中有操作数据库的方法。 在Java里面,缓存通常是指Java对象的属性

  • 问题内容: 我是一个Android初学者。在尝试管理活动生命周期的代码时,我遇到了新问题。 我对代码理解得很好,但是在ActionBar SuppressLint中却给出了错误。当我双击它时,正在添加。这是什么意思? 问题答案: 是Android Lint工具使用的注释。 当代码中的某些内容不是最佳的或可能崩溃时,Lint会告诉您。通过传递,您将抑制所有警告,这些警告会告诉您是否正在使用在您的设备

  • 问题内容: 我在这里使用教程来了解JAXB。 当作者开始创建文档的根时,作者开始如下: 尽管我将手动生成类而不是让Eclipse生成类,但我将提供一个jar文件(未打包在其中,而是在包含jar文件的文件夹中),以便在我的应用程序启动时验证XML文档是否已被篡改。 因此,在XSD文件中,将会是 因为上面已将其声明为?? 问题答案: 我建议使用包级别注释为模型指定名称空间限定。程序包级别的注释位于一个

  • 问题内容: 我正在尝试在Hibernate 3.5中使用注释 检索数据时,一切正常。但是我无法使其重新排序列表中的元素并将新的订单保存到数据库中。 问题答案: Hibernate不支持@OneToMany(mappedBy =“ …”)和@OrderColumn的组合。此JIRA问题跟踪使用此无效组合时引发更明显错误消息的请求:http : //opensource.atlassian.com/p

  • 问题内容: 有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,ID和部门名称。每个工人都有名字,身份证。 我试图与一对多和多对一建立联系,但未成功。 公司 部 工人 我从开始: 它填充公司,但不填充其他表,也没有创建任何联接(映射)错误: 问题答案: 除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所有