一对多的表创建

时间:2015-07-25 10:28:02

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

我是Hibernate的新手,这是我的第一个应用程序,它是企业级的。 我陷入了一对多的映射。我整天都进行了映射,但它没有为我提供正确的表格结构。

这是我要映射的ER图 ER Diagram

这些是课程

饲料类

@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
}

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

Table Structure

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

我可以通过将@OneToMany注释和属性移动到Feed表来实现此目的。但是,如果我将其移至Feed类,我如何在JSP页面中表示订阅源订单详细信息?

我也在使用spring这个项目。

4 个答案:

答案 0 :(得分:1)

你向后设计了它。您的架构说1 Feed实例包含M FeedOrderDetail实例。

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

答案 1 :(得分:1)

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

因此,请在Feed中引用List<FeedOrderDetail>,并在FeedOrderDetail中单独引用Feed。

分类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();

答案 2 :(得分:0)

正确的是:

vector

并且

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

答案 3 :(得分:0)

  

我的问题是为什么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
}

我希望它有所帮助:)