2

我正在使用 Spring-data Hibernate 等开发 REST 应用程序。我已经设置了所有基本操作,但现在我想做一些具体的事情。当我检索具有指向我的数据库中另一个表的外键的项目列表时,休眠将返回该外键的整行。例如:

[ {
  "id":1, 
  "school": {"id":1, "name":"De regenboog", password":"800e30e9bb3b82ce955a127650d835d0", "street":"Plantaanstraat", "number":"2", "zipCode":"1234AS", "city":"Amsterdam", "contactName":"Arends", "contactPhoneNumber":"06-45648466", "contactEmail":"arends@regenboog.nl"}, 
  "name":"Groep", 
  "dateCreated":"2012-04-25"
  }
]

(顺便说一下,这些都是虚构的数据)

现在的问题是不希望学校全部归还。我只想显示school_id。我在网上搜索并阅读了一些关于“服务级别映射”的内容,但我找不到任何示例。我用一个构建了我的应用程序

控制器 -> 服务 -> dao -> 存储库

设置。

我希望你们能帮助我!(如果您还需要更多源代码,请告诉我)。

非常感谢

编辑

我要补充的是,我的 MySql 表如下所示:

身份证 | 学校 ID | 姓名 | 创建日期

所以我想要返回的只是普通的 school_id 而不是目标学校(在这种情况下)

EDIT2 我正在处理@Dandy 答案,我想展示我现在拥有的代码:

@ManyToOne
@JoinColumn(name = "SCHOOL_ID")
private School school;

@Column(name = "SCHOOL_ID", insertable = false, updatable = false)
private long schoolId;

public long getSchoolId() {
    return schoolId;
}

public void setSchoolId(long schoolId) {
    this.schoolId = schoolId;
}

public School getSchool() {
    return school;
}

public void setSchool(School school) {
    this.school = school;
}

当我像 Danny 建议的那样更改代码时,我得到了我想要的结果......几乎。如果我现在运行查询,这就是我得到的:

[ {
  "id":1, 
  "school": {"id":1, "name":"De regenboog", password":"800e30e9bb3b82ce955a127650d835d0", "street":"Plantaanstraat",  "number":"2", "zipCode":"1234AS", "city":"Amsterdam", "contactName":"Arends", "contactPhoneNumber":"06-45648466", "contactEmail":"arends@regenboog.nl"},    
  "schoolId": 1  
  "name":"Groep", 
  "dateCreated":"2012-04-25"
  }
]

问题是我想禁用school这个特定查询。那可能吗?

4

3 回答 3

3

几天过去了,我找到了一个适合我的解决方案。我做了一些新的类 IE SchoolDTO(DTO 代表数据传输对象)。在这些类中,我只将我想要显示的值添加到前端。IE:

public class ClassesDTO {

    private long id;
    private long schoolId;
    private String schoolName;
    private String name;
    private Date dateCreated;

    //Getters and setters...
}

我没有显示整个 School 对象,而是只包括了它的 ID 和 NAME。在这个类里面只有 getter 和 setter。然后我制作了一个映射器,它将原始类映射到新的 DTO 类。IE。

public ClassesDTO mapToDTO(Classes classes) {
    ClassesDTO classesDTO = new ClassesDTO();
    classesDTO.setId(classes.getId());
    classesDTO.setSchoolId(classes.getSchool().getId());
    classesDTO.setSchoolName(classes.getSchool().getName());
    // etc...

然后在我的服务层中,我将新映射的 DTO 对象返回给我的控制器,而不是普通的 Classes 对象。

实际上就是这样。如果我需要返回 a java.util.List,我也有一个映射,如果我想将数据插入我的数据库而不需要声明整个学校,我也有一个映射。我将展示一个简单的示例,只是有人想知道我是如何做到的:

public Classes mapFromDTOCreate(ClassesCreateDTO classesCreateDTO){
    Classes classes = new Classes();
    classes.setSchool(schoolDAO.findSchoolById(classesCreateDTO.getSchoolId()));
    classes.setName(classesCreateDTO.getName());
    classes.setDateCreated(classesCreateDTO.getDateCreated());
    return classes;
}

这个新的类对象我可以安全地返回到我的 DAO,hibernate 可以将它保存到我的数据库中,因为 ORM(对象关系映射)。

如果有人有任何问题,请告诉我!

于 2012-05-11T20:30:11.340 回答
2

目前,school可能使用<many-to-one>关系进行映射。

<many-to-one name="school" class="School">
    <column name="SCHOOL_ID" type="string" />
</many-to-one>

您可以为 SCHOOL_ID 再添加一个字段。

<property name="schoolId" column="SCHOOL_ID" type="string" insert="false" update="false"/>

注意:insert="false" update="false"如果一个列被多次映射,则需要。

于 2012-05-08T10:34:55.260 回答
1

如果您使用(默认)Jackson 映射器进行 JSON 序列化,@JsonIgnore如果您不希望它们被序列化,则可以在实体中注释属性。

于 2012-05-08T09:55:56.077 回答