我有两个简单的表格如下:
ID 值
ID PROPERTY_ID
uid_property中的每一行都是唯一的。可以将属性分配给多个属性。
在hibernate中映射这个的最佳方法是什么?我正在试图决定这是不是很好或者很多。请帮忙!
答案 0 :(得分:0)
嗯,你必须考虑问题。为了拥有ManyToMany
,您需要让两个表彼此保持引用。您在property_id
中有一个Uid_property
,因此可能有多条Uid_property
条记录具有相同的property_id
,但您没有任何允许Property
引用的记录Uid_property
。
从Uid_property
实体的角度来看,Many
One
可能有Property
条记录。为了在JPA中重现数据库,您只需编写以下代码:
@Entity
public class Property {
@Id @GeneratedValue private Long id;
}
@Entity
public class Uid_property {
@Id @GeneratedValue private Long id;
@ManyToOne
Property property;
}
这将产生以下表格:
create table Property(id bigint not null,primary key(id))
create table Uid_property(id bigint not null,property_id bigint,primary key(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]