2015-01-25 2 views
0

Я создал простой веб-сервер, который использует Hibernate для хранения объектов в базе данных MySQL. Кроме того, как вы можете ожидать, он разделяет некоторые библиотеки с клиентами в пакете <...>.shared> для доступа к различным ресурсам. Среди них есть классы POJO, аннотированные аннотациями Hibernate и Jackson. Это пример класса POJO.Зачем нужны библиотеки Hibernate/Jackson для моего приложения?

@JsonInclude(Include.NON_NULL) 
@Entity 
@Table(name = "user", uniqueConstraints = 
{ @UniqueConstraint(columnNames = "email"), 
    @UniqueConstraint(columnNames = "nick") }) 
public class User implements java.io.Serializable, RecognizedServerEntities 
{ 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    private Integer userId; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "threadAuthor", 
     orphanRemoval = false) 
    @Cascade({ CascadeType.SAVE_UPDATE }) 
    private Set<Thread> userThreads = new HashSet<Thread>(0); 
} 

Теперь я пытаюсь создать приложение для Android, которые просто использовать эти общие классы: приложение не нужно знать ничего о Hibernate, javax.persistence и, может быть, даже аннотации Джексона. Однако, когда я создаю новый проект для Android, для этого требуется много библиотек.

74K hibernate-commons-annotations-4.0.5.Final.jar 
5,1M hibernate-core-4.3.6.Final.jar 
38K jackson-annotations-2.4.0.jar 
221K jackson-core-2.4.3.jar 
1,1M jackson-databind-2.4.3.jar 
180K javax.persistence_2.1.0.v201304241213.jar 
714K org.restlet.jar 
55K shared.jar 

Проблема заключается в том, что они значительно увеличивают размер приложения и замедляют процесс разработки, поскольку мне необходимо включить поддержку Multidex. Итак, как я могу решить? Я могу придумать некоторые решения:

  • Измените совместно используемые классы, чтобы не выставлять аннотации. Это жизнеспособное решение? Как я могу эффективно это сделать?
  • Использование ProGuard. Я не знаю, действительно ли это решение, потому что я ничего не знаю об этом инструменте, но для того, что я прочитал, он может помочь удалить классы, которые вообще не используются в проекте.

РЕДАКТИРОВАТЬ: Я частично работал над проблемой, извлекая только необходимые кассы от hibernate-core-4.3.6.Final.jar, что является наибольшей библиотекой. Все еще ищут самые элегантные решения.

ответ

0

Если вы считаете, что ваше приложение имеет слои, в настоящее время вы используете одни и те же классы для доступа к данным и просмотра слоев.

Ваша база данных не интересует аннотации Jackson, и ваш клиент Android не интересуется аннотациями Hibernate.

Два разных подхода, которые я видел для этого: - имеют параллельный «вид» слой представление ваших объектов, имеет аннотаций Джексон, который ваше приложение будет заселить отображением из вашего Hibernate аннотированный слоя доступа к данным ИЛИ - иметь клиентское приложение, не разделяющее классы серверного приложения. Он анализирует JSON и сопоставляет структуры в вашей собственной клиентской модели.

Эти подходы эквивалентны, но могут варьироваться в зависимости от того, где происходит сопоставление.

+0

Спасибо за ваш ответ. Кстати, не могли бы вы уточнить свой ответ с помощью какого-то кода? – tigerjack89

+0

Это зависит от того, какой подход вы предпочитаете. Если вашему клиенту действительно не нужно полное представление объекта на вашей стороне сервера, вы можете просто использовать объекты JsonNode с readTree из ObjectMapper от Jackson. –

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