java—我是否正确描述了实体?

gblwokeq  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(266)

我正在研究如何创建一个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、 例如,一个人只能有一个血型,所以这种关系是一对一的。我在训练课上打了个比方。它们对每个人都是不同的。
提前谢谢。。。

xmjla07d

xmjla07d1#

我们说的是(a,ab,b,0)血型吗?从我记忆中只有四个(添加rh+和rh-修饰将得到8个)。如果是这种情况,您可能需要更改Map类型。许多人可能有相同的血型,因此将其Map为@onetoone并不是最佳选择,因为它将要求您的jpa提供者为每个相关人员创建唯一的血型记录。如果我是你,我会改变这种关系如下:

public class PeopleEntity {
...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "blood_group_id")
private BloodgroupEntity bloodgroupEntityId;
}

如果您想使其具有双向性(这不是强制性的),但允许您从关系的双方访问实体,您可以向您的血型实体添加以下内容:

public class BloodgroupEntity {
...
    @OneToMany(mappedBy = "bloodgroupEntityId")
    private Set<PeopleEntity> people = new HashSet<>();

如果您决定使用双向方法,您必须记住,您需要使关联的双方保持同步,这意味着您需要在类中使用额外的方法。
如果我错了,您正在创建一些医学应用程序,其中每个血型都是唯一的,并且只分配给世界上的一个人,那么ok@onetoone是一个很好的选择,尽管您可以使用@mapsid来增强它。
如果您只是一般地学习jpa和hibernate,请记住:
集合关联是可选的-您可以用sql查询或使用jpa查询接口(以加快速度)替换所有这些。如果以错误的方式组合集合Map,可能会导致大量数据的实际性能问题。
我建议首先关注事务和状态管理,这将帮助您了解orm如何与实体一起工作。它将帮助您理解在Map集合(例如lazyinitializationexception)时可能发生的错误以及如何避免这些错误;
在研究集合Map时,我建议从最常见的一个开始,一个接一个地处理它们,我猜是@manytoone(然后处理@onetomany的双向Map)。使用不同的获取类型,不同的层叠选项。然后是一个又一个

s71maibg

s71maibg2#

这篇文章说最好不要使用set:https://vladmihalcea.com/hibernate-multiplebagfetchexception/

相关问题