这段代码是 ORM 的正常行为吗?
is this code normal behavior of ORMs?
我有这两个对象:Project 和 History
下面是那些类
的最少代码
项目
@Entity(name = "projects")
public class Project {
@Id
private String name;
@OneToMany(MappedBy = "project")
private List<History> histories;
}
历史
@Entity(name = "histories")
public class History {
@Id
private Integer id;
@ManyToOne
@JoinColum(name = "project_name")
private Project project;
}
我可以轻松创建 EntityManager 和创建 tables。一切都在这里,正确的列轻轻地等待插入数据。
但是,我不确定这是否是 ORM 的正确行为。
基本上如果它看起来像这样就很理想了:
- 创建历史 + 设置历史
- 创建项目 + 设置项目 + 在项目中添加历史 的列表历史
- 使用其 DAO
在数据库中插入 Project
当我尝试执行这样的代码时,只有 projects table 有数据,histories table 是空的,这迫使我按照以下方式编写代码:
- 创建历史 + 设置历史
- 创建项目 + 设置项目 + 在项目中添加历史 的列表历史
- 使用其 DAO
在数据库中插入 History
- 使用其 DAO
在数据库中插入 Project
好的,这只是一行额外的代码,但如果我需要获取数据或向一个 Project 添加更多历史记录怎么办?
如果是这样,我将需要加载项目和所有相关的历史记录并将物理历史记录添加到 Project 对象......这样的代码很容易写起来很麻烦。
无论如何,这是任何 ORM 的正常行为还是我的 ORM 在愚弄我?
注意 : 我正在使用带有 SQLite 驱动程序的 ORMLite。
我相信您观察到的行为是默认行为,但您应该能够更改它并使底层 History
对象默认保留。在 Project
中的 @OneToMany
注释中,尝试将 cascade
字段指定为 cascade = CascadeType.PERSIST
(假设您使用的是 javax.persistence.OneToMany
)。有关其他选项,请参阅 documentation。
我有这两个对象:Project 和 History
下面是那些类
的最少代码项目
@Entity(name = "projects")
public class Project {
@Id
private String name;
@OneToMany(MappedBy = "project")
private List<History> histories;
}
历史
@Entity(name = "histories")
public class History {
@Id
private Integer id;
@ManyToOne
@JoinColum(name = "project_name")
private Project project;
}
我可以轻松创建 EntityManager 和创建 tables。一切都在这里,正确的列轻轻地等待插入数据。
但是,我不确定这是否是 ORM 的正确行为。
基本上如果它看起来像这样就很理想了:
- 创建历史 + 设置历史
- 创建项目 + 设置项目 + 在项目中添加历史 的列表历史
- 使用其 DAO 在数据库中插入 Project
当我尝试执行这样的代码时,只有 projects table 有数据,histories table 是空的,这迫使我按照以下方式编写代码:
- 创建历史 + 设置历史
- 创建项目 + 设置项目 + 在项目中添加历史 的列表历史
- 使用其 DAO 在数据库中插入 History
- 使用其 DAO 在数据库中插入 Project
好的,这只是一行额外的代码,但如果我需要获取数据或向一个 Project 添加更多历史记录怎么办? 如果是这样,我将需要加载项目和所有相关的历史记录并将物理历史记录添加到 Project 对象......这样的代码很容易写起来很麻烦。
无论如何,这是任何 ORM 的正常行为还是我的 ORM 在愚弄我?
注意 : 我正在使用带有 SQLite 驱动程序的 ORMLite。
我相信您观察到的行为是默认行为,但您应该能够更改它并使底层 History
对象默认保留。在 Project
中的 @OneToMany
注释中,尝试将 cascade
字段指定为 cascade = CascadeType.PERSIST
(假设您使用的是 javax.persistence.OneToMany
)。有关其他选项,请参阅 documentation。