【发布时间】:2016-05-25 23:47:03
【问题描述】:
我有 2 个简单的表格如下:
属性
身份证 价值
Uid_property
>身份证 property_id
uid_property 中的每一行都是唯一的。一个属性可以分配给多个属性。
在hibernate中映射它的最佳方法是什么?我正在尝试确定这是单对多还是多对多。请帮忙!
【问题讨论】:
我有 2 个简单的表格如下:
身份证 价值
身份证 property_id
uid_property 中的每一行都是唯一的。一个属性可以分配给多个属性。
在hibernate中映射它的最佳方法是什么?我正在尝试确定这是单对多还是多对多。请帮忙!
【问题讨论】:
好吧,你必须把问题想清楚。为了拥有ManyToMany,您需要让两个表都保持对彼此的引用。您在Uid_property 中有一个property_id,因此可以有许多具有相同property_id 的Uid_property 记录,但是您没有任何东西可以让Property 引用Uid_property。
从Uid_property 实体的角度来看,One Property 可以有 Many 记录。为了在 JPA 中重现数据库,您可以简单地编写以下代码:
@Entity
public class Property {
@Id @GeneratedValue private Long id;
}
@Entity
public class Uid_property {
@Id @GeneratedValue private Long id;
@ManyToOne
Property property;
}
这将产生以下表格:
创建表属性(id bigint 不为空,主键(id))
创建表uid_property(id bigint not null,property_id bigint,主键(id))
这符合你所说的,但是有一个效率问题。如果检索到多个Uid_property 记录,则会创建重复的Property 实体:
List<Uid_property> pl = em.createQuery("select up from Uid_property up", Uid_property.class).getResultList();
pl.forEach(uid_p->{ System.out.println(uid_p + ":" + uid_p.getProperty()); });
给予:
model.Uid_property@5b58ed3c:model.Property@592e843a model.Uid_property@24faea88:model.Property@592e843a
如果有一个 Property 引用了许多 Uid_property 实体,效率会更高。
@Entity
public class Property {
@Id @GeneratedValue private Long id;
@OneToMany(mappedBy="property")
private Set<Uid_property> uid_properties;
}
// This hasn't changed
@Entity
public class Uid_property {
@Id @GeneratedValue private Long id;
@ManyToOne
private Property property;
}
现在从数据库中获取实体更加高效。属性可以加入Uid_properties:
List<Property> pl = em.createQuery("select distinct p from Property p left join fetch p.uid_properties", Property.class).getResultList();
pl.forEach(p->{ System.out.println(p + ":" + p.getUid_properties()); });
这为同一数据库架构提供了一个 Property 和一个 Set 的 uid_properties。
model.Property@61078690:[model.Uid_property@37ebc9d8, model.Uid_property@1cb3ec38]
【讨论】: