【问题标题】:Entity Mapping - Manytomany or OneToMany实体映射 - Manytomany 或 OneToMany
【发布时间】:2016-05-25 23:47:03
【问题描述】:

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

属性

身份证 价值

Uid_property

​​>

身份证 property_id

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

在hibernate中映射它的最佳方法是什么?我正在尝试确定这是单对多还是多对多。请帮忙!

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    好吧,你必须把问题想清楚。为了拥有ManyToMany,您需要让两个表都保持对彼此的引用。您在Uid_property 中有一个property_id,因此可以有许多具有相同property_idUid_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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多