【问题标题】:One to many table creation一对多表创建
【发布时间】:2015-10-16 00:13:37
【问题描述】:

我对 Hibernate 非常陌生,这是我的第一个企业级应用。 我被困在一对多映射上。我做了一整天的映射,但它并没有为我提供正确的表结构。

这是我要绘制的 ER 图

这些是类

饲料类

@Entity
public class Feed {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String name;
private long quantity;
//With getters and setters
}

Feed 订单详细信息类

@Entity
public class FeedOrderDetail {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private double unitPrice;
private long quantity;

@OneToMany(cascade=CascadeType.MERGE)
@JoinColumn(name="feed_id")
private List<Feed> feed = new ArrayList<Feed>();

//Getters and Setters
}

部署应用程序后,我得到以下表结构

我的问题是 为什么 feed_id 在 Feed 表中? 每次添加提要订单详细信息时,是否都应该添加相同的提要? (这不是一个好主意)

我可以通过将 @OneToMany 注释和属性移动到 Feed 表来实现这一点。但是如果我将它移到 Feed 类中,我如何在 JSP 页面中表示 Feed 订单详细信息?

我也在这个项目中使用 spring。

【问题讨论】:

    标签: java mysql hibernate jakarta-ee entity-relationship


    【解决方案1】:

    我建议在关系的双方都有一个对象引用。

    因此,请在 Feed 中引用 List&lt;FeedOrderDetail&gt;,并在 FeedOrderDetail 中单独引用 Feed。

    课程提要:

    @Entity
    public class Feed {
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private long id;
        private String name;
        private long quantity;
        //With getters and setters
    
        // !new!
        @OneToMany(mappedBy = "feed") // mappedBy references the fieldname in the other Java class
        private List<FeedOrderDetail> details;
    }
    

    课程详情:

    @Entity
    public class FeedOrderDetail {
    
         @Id
         @GeneratedValue(strategy=GenerationType.AUTO)
         private Long id;
         private double unitPrice;
         private long quantity;
    
         @ManyToOne(cascade=CascadeType.MERGE)
         @JoinColumn(name="feed_id")
         private Feed feed; // only a single feed reference
    
         //Getters and Setters
    }
    

    如果您想使用 Hibernate 的 JPA API 获取提要列表,则可以使用以下代码:

    TypedQuery<Feed> query = entityManager.createQuery("SELECT f FROM Feed f", Feed.class);
    List<Feed> feeds = query.getResultList();
    

    【讨论】:

    • 您的回答很有魅力。但是如何将这些字段放在 JSP 页面中。因为 List 在 Feed 类中?如何以jsp形式访问?
    • @thusithaniroshan 我添加了一些代码来展示如何检索提要列表。这能解决您的问题吗?
    【解决方案2】:

    你是倒着设计的。您的架构说 1 个 Feed 实例包括 M FeedOrderDetail 实例。

    因此,在 Feed 类中,您应该有一个 List&lt;FeedOrderDetail&gt;。但这不是你所做的。您在 FeedOrderDetail 中有一个 List&lt;Feed&gt;

    【讨论】:

    • 如果我们每次添加 Feed 订单详细信息时将 M 端移动到 Feed 表,我们就会有重复的 Feed 行。不是吗?
    • 我不建议你将 M 端移动到 Feed 中。我建议正好相反:你的模式是正确的,但你的代码不是,因为它不尊重模式。 Feed 有很多细节。那就是你想要的。但是您用 Java 编写的代码是“一个细节有很多提要”。
    • 哦,好的。我的坏。对不起,误会了。我现在明白了。谢谢你的帮助。
    【解决方案3】:

    正确的是:

    @Entity
    public class Feed {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    private String name;
    private long quantity;
    //With getters and setters
    @OneToMany(cascade=CascadeType.MERGE, mappedBy="feed")
    private List<FeedOrderDetail> orders = new ArrayList();
    }
    

    还有

    @Entity
    public class FeedOrderDetail {
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private double unitPrice;
    private long quantity;
    
    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="feed_id")
    private Feed feed;
    
    //Getters and Setters
    }
    

    【讨论】:

      【解决方案4】:

      我的问题是为什么 feed_id 在 Feed 表中?

      你是对的,如果你的 ER 图是对的,那不应该是这样。

      您的 ER 图和表结构不匹配,所以我试图根据您的 ER 图为您提供类映射。

      Feed.java

      @Entity
      public class Feed {
      
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private long id;
      private String name;
      private long quantity;
      //With getters and setters
      @OneToMany(fetch = FetchType.LAZY, mappedBy = "feed")
          public Set<FeedOrderDetail> getFeedOrderDetail() {
              return this.feedOrderDetail ;
          }
      }
      

      FeedOrderDetail.java

      @Entity
      public class FeedOrderDetail {
      
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private Long id;
      private double unitPrice;
      private long quantity;
      
      @ManyToOne(fetch = FetchType.LAZY)
          @JoinColumn(name = "FEED_ID", nullable = false)
          public Feed getFeed() {
              return this.feed;
          }
      
      //Getters and Setters
      }
      

      希望对你有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 2021-10-18
        • 1970-01-01
        • 2011-10-25
        • 2012-02-28
        相关资源
        最近更新 更多