2012-05-08 3 views
2

Я работаю над приложением REST с Hibernate с данными Spring и т. Д. Я настроил все свои основные действия, но теперь я хочу что-то сделать конкретный. Когда я получаю список элементов, которые имеют внешний ключ в другой таблице в моей базе данных, hibernate вернет всю строку этого внешнего ключа. Например:Как изменить способ возврата объектов в 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":"[email protected]"}, 
    "name":"Groep", 
    "dateCreated":"2012-04-25" 
    } 
] 

(Все эти литературные данные по пути)

Теперь дело это не хотят, чтобы школа возвращается в полном объеме. Я просто хочу показать school_id. Я искал по сети и читал некоторые вещи о «сопоставлении уровня сервиса», но я не смог найти никаких примеров. Я построил мое приложение с контроллером

-> Сервис -> дао -> хранилище

установки.

Надеюсь, вы, ребята, можете мне помочь! (дайте мне знать, если вам нужно больше исходного кода).

Большое спасибо

EDIT

То, что я хочу добавить, что мой MySql таблица выглядит следующим образом:

ID | SCHOOL_ID | ИМЯ | DATE_CREATED

Так что я хотел бы, чтобы вернулись только равнина 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; 
} 

Когда я меняю код, как предложил Дэнни, я получаю результат, который я хочу .. почти. Это то, что я получу, если выполнить запрос прямо сейчас:

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

Дело в том, что я хочу, чтобы отключить school для данного конкретного запроса. Это возможно?

ответ

2

Прошло несколько дней, и я нашел решение, которое сработало для меня. Я сделал несколько новых классов IE SchoolDTO (DTO означает Data Transfer Object).Внутри этих классов я только добавил значения, которые я хотел показать передним концом. то есть:

public class ClassesDTO { 

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

    //Getters and setters... 
} 

Вместо того чтобы показывать весь объект школы, я включил его только ИД и ИМЯ. Внутри этого класса есть только геттеры и сеттеры. Затем я создаю карту, которая отобразит исходные классы в новый класс DTO. то есть.

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 на мой контроллер вместо объекта нормальных классов.

И это все на самом деле. У меня также есть сопоставление, если мне нужно вернуть 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, который спящий режим может сохранить в моей базе данных причины ORM (Object реляционные отображение).

Если у кого есть вопросы, пожалуйста, дайте мне знать!

1

Если вы используете (по умолчанию) Jackson mapper для сериализации JSON, вы можете аннотировать свойства с помощью @JsonIgnore в своих сущностях, если вы не хотите, чтобы они были сериализованы.

+0

Проблема (я думаю) в том, что у меня есть ситуации, когда я хочу, чтобы они показывались. Как управлять ими? (Например, когда я спрашиваю школу) –

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" необходимо, если столбец отображается более чем один раз.

+0

Спасибо! Я попробую! –

+0

Проблема, с которой я столкнулся сейчас, заключается в том, что Spring-data использует исходную школу для перечисления всех классов. Любой способ переопределить это поведение, и позволить spring-data использовать новый schoolId? –

+0

Я обновил свой вопрос –

Смежные вопросы