我正在研究如何创建一个web应用程序+到数据库的链接。项目 Spring 启动+百里香。实体:
@Entity
@Table(name = "childrens", schema = "public", catalog = "people")
@EqualsAndHashCode(of = "id")
@Getter
@Setter
@DynamicUpdate
@DynamicInsert
@SelectBeforeUpdate
public class PeopleEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private long id;
private String name;
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name = "operation_id")
private ChildrenEntity сhildrenEntityId;
@OneToOne(fetch=FetchType.LAZY)
//@JoinColumn(name = "blood_group_id")
private BloodgroupEntity bloodgroupEntity;
}
@Entity
@Table(name = "childrens", schema = "public", catalog = "blood_group")
...
public class BloodgroupEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private long id;
private String name;
@OneToOne
@JoinColumn(name="id")
private PeopleEntity peopleEntity;
}
表格:
CREATE TABLE people (
id BIGINT NOT NULL,
NAME VARCHAR(100) NOT NULL,
id_blood_group BIGINT NOT NULL,
PRIMARY KEY ( pk_people )
)
ALTER TABLE public.people ADD CONSTRAINT fk_cblood_group FOREIGN KEY (id_blood_group) REFERENCES blood_group(id) ON UPDATE CASCADE
CREATE TABLE blood_group (
id BIGINT NOT NULL,
NAME VARCHAR(100) NOT NULL,
id_children BIGINT NOT NULL,
PRIMARY KEY ( pk_blood_group )
)
控制器
private List<OperationTableEntity> peopleEntityList;
private List<BloodgroupEntity> bloodgroupEntityList;
@GetMapping(value = "/add-product-type")
public String showAddOperation(@ModelAttribute("peopleEntityList") PeopleEntity peopleEntity
Model model) {
peopleEntityList = peopleEntityService.getAll();
bloodgroupEntityList = bloodgroupEntityService.getAll();
model.addAttribute("peopleEntityList", peopleEntityList);
model.addAttribute("bloodgroupEntityList", childrenEntityList);
return "add-people";
}
@PostMapping(value = "/people/new")
public String createPeople(@ModelAttribute("peopleEntity") PeopleEntity peopleEntity) {
peopleEntityService.save(peopleEntity);
return "redirect:/add-product-type";
}
我在网络上使用thymeleaf。文件add-people.html:
...
<form id="f-prt-01" th:method="POST" th:action="@{/people/new}" th:object="${peopleEntity}" name="formPrType">
<div class="form-group mt-1">
<label for="inputName">Имя</label>
<input type="text" class="form-control" id="inputName" placeholder="Имя" th:field="*{name}" autofocus required>
<label for="inputGroupSelect02">группа</label>
<div class="input-group mb-3">
<select class="custom-select" id="inputGroupSelect02" th:field="*{сhildrenEntityId}">
<option th:each="bloodgroupTable : ${bloodgroupEntityList}"
th:value="${bloodgroupTable.id}"
th:text="${bloodgroupTable.name}"/>
</select>
</div>
</div>
<button type="submit" class="btn btn-primary">Сохранить</button>
</form>
有人能看一下并告诉我是否正确实现了表的代码吗 PeopleEntity
以及 BloodgroupEntity
? i、 例如,一个人只能有一个血型,所以这种关系是一对一的。我在训练课上打了个比方。它们对每个人都是不同的。
提前谢谢。。。
2条答案
按热度按时间xmjla07d1#
我们说的是(a,ab,b,0)血型吗?从我记忆中只有四个(添加rh+和rh-修饰将得到8个)。如果是这种情况,您可能需要更改Map类型。许多人可能有相同的血型,因此将其Map为@onetoone并不是最佳选择,因为它将要求您的jpa提供者为每个相关人员创建唯一的血型记录。如果我是你,我会改变这种关系如下:
如果您想使其具有双向性(这不是强制性的),但允许您从关系的双方访问实体,您可以向您的血型实体添加以下内容:
如果您决定使用双向方法,您必须记住,您需要使关联的双方保持同步,这意味着您需要在类中使用额外的方法。
如果我错了,您正在创建一些医学应用程序,其中每个血型都是唯一的,并且只分配给世界上的一个人,那么ok@onetoone是一个很好的选择,尽管您可以使用@mapsid来增强它。
如果您只是一般地学习jpa和hibernate,请记住:
集合关联是可选的-您可以用sql查询或使用jpa查询接口(以加快速度)替换所有这些。如果以错误的方式组合集合Map,可能会导致大量数据的实际性能问题。
我建议首先关注事务和状态管理,这将帮助您了解orm如何与实体一起工作。它将帮助您理解在Map集合(例如lazyinitializationexception)时可能发生的错误以及如何避免这些错误;
在研究集合Map时,我建议从最常见的一个开始,一个接一个地处理它们,我猜是@manytoone(然后处理@onetomany的双向Map)。使用不同的获取类型,不同的层叠选项。然后是一个又一个
s71maibg2#
这篇文章说最好不要使用set:https://vladmihalcea.com/hibernate-multiplebagfetchexception/