2017-01-18 3 views
0

Как это называется и как решить мою следующую проблему в API. Я должен возвращать тот же объект с разными представлениями. Некоторые данные не должны возвращаться пользователю. Вот пример: Родитель:Hibernate - как загрузить другой вид того же объекта

public class OrginalObject{ 
    private int id; 
    private String name; 
    private String surname; 
    private int age; 
    private String school; 
    private String secret; 
    private Address Address; 

ребенок:

public class Address{ 
    private int id; 
    private String street; 
    private String zipCode; 
    private String Country; 

Если я хочу, чтобы загрузить список полных объектов я бы назвал:

session.createCriteria(OrginalObject.class).list(); 

1.) Но если Дон» я хочу, чтобы кто-то знал мою секретную собственность, мне нужно скрыть это. Но я не знаю, как назвать это из базы данных так, как это будет иметь любое другое свойство. Что-то вроде:

session.createCriteria(OrginalObjectPublic.class).list(); 

2.) Также у меня есть возможность загрузить только «важные» данные. Это означает только свойства id, name, school.

session.createCriteria(OrginalObjectImportant.class).list(); 

Есть ли способ сделать адаптер/«пользовательский вид», чтобы напрямую загрузить его из базы данных? Я знаю, что могу написать чистый sql, но я бы хотел использовать его на объектах с 20 + свойствами, которые имеют вложенные списки/объекты.

3.) Также как использовать это преобразование для загрузки только нескольких свойств вложенного объекта с объектами оригинала. Пример JSON (только идентификатор, название школы от OrginalOBject и ид, улица из Адрес:

{ 
    "id": 1, 
    "name": "testname", 
    "school": "testschool", 
    "Address": { 
    { 
     "id": 33, 
     "street": "testStreet 33" 
    } 
} 

4.) также, как использовать его на вложенных списках, если адрес будет массив:

public class OrginalObject{ 
    ... 
    private List<Address> AddressList; 

ответ

1

С hibernate - это постоянная структура, и вы не можете сохранять/сохраняться в представлении, это невозможно. Да, вы можете сделать представление, имеющее имя, подобное таблице, и предпочесть представление, но вы больше не сможете его хранить.

  1. Вы можете удалить геттер (getSecret) из объекта. Таким образом, база данных все еще имеет поле, но ваша организация не знает об этом. Это может вызвать проблемы, если вы попытаетесь сохранить данные с помощью этого объекта, вы не сможете установить секрет.
  2. Вы можете сделать по умолчанию получателем (доступ на уровне пакета) и запечатать пакет, чтобы никто кроме закрытых проектов не получал доступ к получателю.
  3. Вы можете использовать spring's method authorization mechanism
+0

Спасибо. Мне просто нужно это для чтения. Я не знал, что у меня могут быть сущности с одинаковыми именами. Попробуй – AndroidTank

1

Сначала никто иметь доступ к секрету, только вы программист, который, как предполагается, чтобы увидеть его. Второй, если никто не должен иметь его, чтобы сохранить его. И если вы хотите вытащить его, вы можете использовать наследование. что-то вроде

public abstract PublicObject { 
    ... 
} 

public OriginalObject extends PublicObject { 
    String secret; 
} 

Edit: 2-й & 4-й вопросы, вы можете решить их с HQL:

String hql = "SELECT O.id, O.name, O.school FROM OrginalObject O"; 
Query query = session.createQuery(hql); 
List results = query.list(); 

, как для 3-й вопрос зависит от вашего API.если вы используете джексон, например, вы можете использовать @JsonIgnore

+0

Спасибо. Я забыл добавить в описании, что это на API. Поэтому я могу возвращать разные представления пользователю. сейчас отредактирует .. – AndroidTank

+0

Я отредактировал свой ответ – Mehdi

1

Вы можете сопоставить несколько объектов с одной и той же таблицей, каждая из которых имеет набор свойств, которые вы хотите открыть. Взгляните на this question.

+0

Выглядит многообещающе. Я должен посмотреть на это. Благодаря! – AndroidTank

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