一对多 table 创建
One to many table creation
我是 Hibernate 的新手,这是我的第一个企业级应用程序。
我被困在一对多的映射中。我做了一整天的映射,但它并没有为我提供正确的 table 结构。
这是我要映射的ER图
这些是 Classes
供稿Class
@Entity
public class Feed {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String name;
private long quantity;
//With getters and setters
}
Feed 订单详细信息Class
@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 结构
我的问题是
为什么 feed_id 在 Feed table 中?
我是否应该在每次添加 Feed 订单详细信息时都添加相同的 Feed? (这不是个好主意)
我可以通过将 @OneToMany 注释和属性移动到 Feed table 来实现这一点。但如果我将其移至 Feed class,我如何在 JSP 页中显示 Feed 订单详细信息?
我也在这个项目中使用 spring。
你把它设计反了。您的架构表示 1 个 Feed 实例包含 M 个 FeedOrderDetail 实例。
因此,在 class 供稿中,您应该有一个 List<FeedOrderDetail>
。但这不是你所做的。您在 FeedOrderDetail 中有一个 List<Feed>
。
我建议在关系的两边都有一个对象引用。
所以在 Feed 中引用 List<FeedOrderDetail>
并在 FeedOrderDetail
中引用一个 Feed。
Class 供稿:
@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;
}
Class 详情:
@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();
正确的是:
@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
}
My problems are why feed_id is in Feed table?
你是对的,应该不是万一你的ER图是对的。
你的ER图和table结构不匹配,所以我试图根据你的ER图给你class映射。
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
}
希望对您有所帮助:)
我是 Hibernate 的新手,这是我的第一个企业级应用程序。 我被困在一对多的映射中。我做了一整天的映射,但它并没有为我提供正确的 table 结构。
这是我要映射的ER图
这些是 Classes
供稿Class
@Entity
public class Feed {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String name;
private long quantity;
//With getters and setters
}
Feed 订单详细信息Class
@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 结构
我的问题是 为什么 feed_id 在 Feed table 中? 我是否应该在每次添加 Feed 订单详细信息时都添加相同的 Feed? (这不是个好主意)
我可以通过将 @OneToMany 注释和属性移动到 Feed table 来实现这一点。但如果我将其移至 Feed class,我如何在 JSP 页中显示 Feed 订单详细信息?
我也在这个项目中使用 spring。
你把它设计反了。您的架构表示 1 个 Feed 实例包含 M 个 FeedOrderDetail 实例。
因此,在 class 供稿中,您应该有一个 List<FeedOrderDetail>
。但这不是你所做的。您在 FeedOrderDetail 中有一个 List<Feed>
。
我建议在关系的两边都有一个对象引用。
所以在 Feed 中引用 List<FeedOrderDetail>
并在 FeedOrderDetail
中引用一个 Feed。
Class 供稿:
@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;
}
Class 详情:
@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();
正确的是:
@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
}
My problems are why feed_id is in Feed table?
你是对的,应该不是万一你的ER图是对的。
你的ER图和table结构不匹配,所以我试图根据你的ER图给你class映射。
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
}
希望对您有所帮助:)