为什么我的应用程序需要Hibernate / Jackson库?

时间:2015-01-25 10:32:55

标签: android hibernate jackson

我创建了一个简单的Web服务器,它使用Hibernate在MySQL数据库上存储实体。此外,正如您所料,它与<...>.shared>包中的客户端共享一些库以访问各种资源。其中,有POJO类,注释了Hibernate和Jackson注释。这是POJO类的一个例子。

@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甚至Jackson注释的任何信息。 但是,当我创建一个新的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中提取所需的casses的问题,这是最好的库。仍在寻找最优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

如果您认为您的应用程序具有图层,那么您目前在数据访问和视图图层中使用相同的类。

您的数据库对Jackson注释并不感兴趣,您的Android客户端对Hibernate注释并不感兴趣。

我见过的两种不同方法是:   - 有一个平行的观点&#39;具有Jackson注释的对象的图层表示,您的应用程序将通过从Hibernate带注释的数据访问层进行映射来填充该注释 要么   - 让您的客户端应用程序不共享服务器应用程序的类。它解析JSON并将结构映射到您自己的客户端特定模型。

这些方法是等效的,但只是根据映射的位置而变化。