- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个需要与数据库交互的程序。这是一个简单的库存管理系统,因此实体是“Item”和“Patron”。
编辑:这是一个使用 Spring boot 和 spring data JPA 的 Vaadin 应用程序
首先,我将从我的 2 个类开始,为了简洁起见,省略 getter/setter。
@Table(name="item")
@Entity
public class Item implements Serializable, Cloneable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long barcode;
@NotNull
private String name, type;
@NotNull
private boolean isAvailable;
@Nullable
private boolean isLate;
@Nullable
private String notes;
@Nullable
private Patron currentPatron;
@Nullable
private Patron[] history;
@Nullable
private Date checkOutDate, dueDate;
public Item() {}
public Item(long barcode, String name, String type, boolean isAvailable) {
this.barcode = barcode;
this.name = name;
this.type = type;
this.isAvailable = isAvailable;
}
public Item(long barcode, String name, String type, String notes, boolean isAvailable) {
this.barcode = barcode;
this.name = name;
this.type = type;
this.notes = notes;
this.isAvailable = isAvailable;
}
public Item(long barcode, String name, String type, String notes, boolean isAvailable, Date checkOutDate, Date dueDate, boolean isLate, Patron currentPatron, Patron[] history) {
this.barcode = barcode;
this.name = name;
this.type = type;
this.notes = notes;
this.isAvailable = isAvailable;
this.checkOutDate = checkOutDate;
this.dueDate = dueDate;
this.isLate = isLate;
this.currentPatron = currentPatron;
this.history = history;
}
}
@Entity
@Table(name="patron")
public class Patron {
@Id
private long id;
@NotNull
private String name, email;
@Nullable
private Item[] checkedOutItems;
@Nullable
private List<Item> itemHistory;
@Nullable
private boolean owesFines;
@Nullable
private int finesOwed;
public Patron() {}
public Patron(long id, String name, String email, boolean owesFines) {
this.id = id;
this.name = name;
this.email = email;
this.owesFines = owesFines;
}
public Patron(long id, String name, String email, Item[] checkedOutItems, List<Item> itemHistory, boolean owesFines, int finesOwed) {
this.id = id;
this.name = name;
this.email = email;
this.checkedOutItems = checkedOutItems;
this.itemHistory = itemHistory;
this.owesFines = owesFines;
this.finesOwed = finesOwed;
}
实际上,Patron 对象是通过使用 MSR 扫描其校园 ID 来实例化的。然后,该数据将填充顾客类别的姓名、电子邮件和 ID 字段。
结账时,顾客首先用MSR刷卡(系统会确认他们在数据库中,如果不在数据库中,则将其添加)。扫描他们的磁条后,他们想要的元素的二维码就会被扫描,这样我们就可以将该元素绑在他们身上。
当某个项目被顾客 checkout 时,我们需要从顾客表中获取他们的id、姓名和电子邮件,然后填充其其余变量: check_out_date
, due_date
等
顾客可以 checkout 许多商品,但只能向顾客 checkout 一件商品。这是否建立了OneToMany
关系?赞助人 -> 元素(
我的思考过程如下:
对于赞助对象有一个 Items 数组来存储他们当前拥有的元素的条形码。有一个项目数组列表来存储有关哪个顾客拥有它以及何时拥有它的信息 List<Item> history
,这样代码就很简单 history.addToFront(something)
对于项目对象有一个 Patron 对象来查看谁拥有它有一个顾客数组列表,可以查看所有 checkout 时间
问题1:使用数组和列表作为两个类的实例数据是否多余?
Q1.2:对象数组和对象列表是否适合这种场景的数据结构?
Q1.3:使用javax.persistence.*;
有什么区别吗?和org.springframework.data.annotation.*;
对于 ID 之类的内容,import javax.validation.constraints.NotNull;
之间有区别吗?和import org.springframework.lang.NonNull;
Q2:这会产生 OneToMany
赞助人和元素之间的关系?
Q3:为了实现这一目标,我相信我的数据库中需要一些额外的表。我在想这样的事情:(并且我意识到在实现新模式时我需要包含适当的 spring 注释)
项目表
create table item(barcode int(10) primary key, name varchar(64) not null, type varchar(64) not null, availability boolean, is_late boolean, note varchar(255), check_out_date Datetime, due_date Datetime); #foreign keys for currentPatron and Patron History
订阅者表
create table patron(id int(10) primary key, name varchar(64) not null, email varchar(64) not null, owes_fines boolean, fines_owed int); #foreign key to item table?
Patron_Item_History 表:这将从订阅者表中提取id、name、email,然后从项目表中提取id、check_out_date、due_date?
Item_Patron_History 表:与上表结构类似?
提前谢谢您。
最佳答案
好的,就到这里,
我假设您正在使用 Spring Boot、Hibernate 作为 ORM 以及可能某种类型的关系数据库 (MySQL) 来构建应用程序。
关于数据库设计:
是的,这里的 Patreon 对象是与 Item 实体具有 OneToMany 关系的拥有实体(因为一个 Patreon 可能有 N 个对象)。您的 Patreon 实体可以进行以下重新设计:
1) 尝试使用非原始类型,尤其是表键(长 id -> 长 id)。
2) 丢失checkOutItems 数组以及itemHistory 列表。首先,关系应该使用集合而不是数组来建模。其次,你不需要这两个。您永远不会以这种方式存储checkedOutItems 或itemHistory。相反,创建一个 List<Item> items
它将在描述关系时存储 Patreon 项目(以下是一些示例: http://www.baeldung.com/hibernate-one-to-many )
3) 同样,对于 Item 实体,您需要丢失历史数组。您唯一需要的是对所属实体(本例中为 Patreon)的引用,从而完成关系的 ManyToOne 方面。
4) 请注意,日期字段应使用 @Temporal
进行注释。还提供正确的类型(您可以阅读更多内容)。
5)项目类通常应该重新设计。
5) 上述所有内容都准备就绪后,假设您使用的是 Spring,您可以创建一个存储库,您可以使用它来查询 Patreon 对象,从而检索对象及其相关实体(项目)。
关于您的问题:
Q1:是的,它看到了。请参阅上文了解更多信息。
Q1.2:没有数组不是。列表或更好的集合更适合。
Q1.3:是的。第一个是关系型中使用的JPA注解 数据库,而第二个是 Spring Data 特定注释 由非此类的数据库和框架使用 (关系)或没有定义标准持久性 API(例如 日本公共(public)事务局)。对于NonNull和NotNull与第一个大致相同 一个实际上取代了后一个(已经完成的事情 经常)。我看到的唯一区别是目标。您可以阅读 更多这里: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/lang/NonNull.html https://docs.oracle.com/javaee/7/api/javax/validation/constraints/NotNull.html
问题2:是的。见上文。
Q3:通过一些巧妙的设计,我认为不需要更多,但是 嘿,如果你觉得这对你有帮助,为什么不呢。只是不要过度杀伤 设计及其复杂性
关于java - 在 JPA 中保留非原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50865099/
我有以下情况要解决,但无法正常工作(尝试了Hibernate和EclipseLink): Table_1: Column_A is Primary Key ... some other
我是 JPA 的新手,但必须在该技术中实现我的项目 我想做的是通过 CriteriaQuery 构建一些数据库查询,但不知道如何将参数列表传递给下面的代码: CriteriaBuilder qb =
我是 JPA 新手,注意到可以通过使用 @Version 注释实体中的字段来使用乐观锁定。我只是好奇,如果之前不存在,持久性提供程序是否会创建一个隐式版本字段。例如网站objectdb状态: "Whe
我有一个 JPA 查询 @Query(value = "SELECT SUM(total_price) FROM ... WHERE ...", nativeQuery = true) 当有匹配的记录
JPA 是否会尝试在已经持久(和非分离)的实体上级联持久化? 为了清楚起见,这是我的情况:我想保留一个新用户: public void addUser(){ //User is an enti
显然,OpenJPA。我也看到提到过 EclipseLink 和 Hibernate,但是在功能上有显着差异吗? 最佳答案 大多数差异来自提供者对 OSGi 的感知程度。例如,您可能需要自己将 Hib
我想将 JPA 用于 micronaut。为此,我使用 io.micronaut.data:micronaut-data-hibernate-jpa:1.0.0.M1 库。每当我运行应用程序并点击端点
我正准备为我的应用实现后端,现在我正在投影数据层。我期待着 Spring 。 最佳答案 Spring Data JPA 不是 JPA 实现。它提供了将数据访问层构建到底层 JPA 顶部的方法。您是否应
假设我有一个表 Item,其中包含一个名为 user_id 的列和一个表 User 以及另一个名为 Superuser 的列: CREATE TABLE Item(id int, user_id in
JPA 2.1 规范说: The entity class must not be final. No methods or persistent instance variables of the
我正在从事一个具有一些不寻常实体关系的项目,我在使用 JPA 时遇到了问题。有两个相关对象;用户,让我们称另一个 X。用户与 X 具有一对多和两个一对一的关系。它基本上看起来像这样 [用户实体] @O
我说的是 JavaEE 中的 JPA。在我读过的一本书中谈到: EntityManager em; em.find(Employee.class, id); “这是实体管理器在数据库中查找实例所需的所
我有 JPA 支持的 Vaadin 应用程序。此应用程序中的组件绑定(bind)到 bean 属性(通过独立的 EL 实现)。一些组件绑定(bind)到外部对象(或其字段),由@OneToOne、@O
是否可以使表中的外键唯一?假设我有实体 A 和 B。 答: @Entity class A extends Serializable { @Id private long id; @OneToOne
我在使用 JPA 时遇到了一点问题。考虑这种情况: 表 A (id_a) | 表 B (id_b, id_a) 我需要的是这样的查询: Select a.*, c.quantity from A as
我有一个由 JPA 管理的实体类,我有一个实体需要在其属性中记录更改。 JPA 是否提供任何方法来处理这种需求? 最佳答案 如果您使用 Hibernate 作为 JPA 提供程序,请查看 Hibern
我想实现以下架构: Table A: a_id (other columns) Table B: b_id (other columns) Table C: c_id (other columns)
我有一个愚蠢的问题。如果能做到的话那就太好了,但我并没有屏住呼吸。 我需要链接到我的 JPA 实体的表中的单个列作为所述 JPA 实体中的集合。有什么方法可以让我单独取回与该实体相关的列,而不必取回整
我有一个 Open JPA 实体,它成功连接了多对多关系。现在我成功地获取了整个表,但我实际上只想要该表中的 ID。我计划稍后调用数据库来重建我需要的实体(根据我的程序流程)。我只需要 ID(或该表中
这是我的一个实体的复合主键。 public class GroupMembershipPK implements Serializable{ private static final long
我是一名优秀的程序员,十分优秀!