实体映射 - Manytomany或OneToMany

时间:2016-05-25 23:47:04

标签: java hibernate jpa

我有两个简单的表格如下:

属性

ID 值

Uid_property

ID PROPERTY_ID

uid_property中的每一行都是唯一的。可以将属性分配给多个属性。

在hibernate中映射这个的最佳方法是什么?我正在试图决定这是不是很好或者很多。请帮忙!

1 个答案:

答案 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()); });

为同一个数据库模式提供单PropertySet个uid_properties。

  

model.Property@61078690:[model.Uid_property@37ebc9d8,model.Uid_property@1cb3ec38]