【问题标题】:What sort of database will I get with an Apache Wicket Application?我将使用 Apache Wicket 应用程序获得什么样的数据库?
【发布时间】:2011-05-18 23:27:29
【问题描述】:

所以我已经完成了面向对象的设计,将数据库模式与我的设计结合在一起,并承诺交付的期限非常短。我决定使用 Web 框架让我的生活“更轻松”。

Spring 似乎非常复杂(而且从表面上看相当不雅),除了基本的 CRUD 应用程序之外,Roo 无法在论坛上理解和/或获得帮助。

我正在使用(和学习!)Wicket 来完成我的任务。我花了很多时间试图弄清楚 Wicket 如何创建和使用数据库,如果我理解正确,它会从我将创建的 POJO 中自动执行此操作。但是,我创建的对象以中等复杂的方式使用对象,并且我想更好地了解最终结果在 mySQL 中的样子。

是否有任何信息或链接可以解释 Wicket 应用程序生成的架构是什么样的?

【问题讨论】:

    标签: java database frameworks wicket


    【解决方案1】:

    自从我上次使用 Wicket 已经 2 年多了,但 AFAIK 它根本不处理持久性。虽然 Wicket 一个非常好的框架恕我直言,你必须自己处理数据库层使用 Hibernate 或其他一些 ORM(当然,或者根本没有 ORM)

    【讨论】:

      【解决方案2】:

      在我看来,您似乎来自 PHP 或 .Net 世界,不习惯 Java 中的工作方式(强调工作)。简而言之:没有免费的午餐,如果您只看一下 Spring 或 Roo 并得出结论,这些都太复杂了,那么您可能会遇到一些艰难的时期。 Java 提供了很多框架和灵活性,但您必须自己动手。

      也就是说,我喜欢 Wicket,尽管它确实有一些学习曲线。 Wicket 有一种很好的方法来模板化和解析实际 Java 代码中的所有业务和控制逻辑。此外,Wicket 拥有一个活跃的社区,拥有非常广泛的文档、wiki 和示例。正如 Joril 指出的那样,Wicket 没有做任何与对象关系映射 (ORM) 或一般 AFAIK 中的持久性相关的事情。可能有扩展或与 Wicket 相关的项目为此提供了一些东西。

      以下是我对如何解决此问题的建议: 使用 Maven2 和 Spring(是的,Spring)并在您的 pom.xml 中导入以下依赖项:

      <properties>
          <spring.version>3.0.0.RELEASE</spring.version>
          <wicket.version>1.4.10</wicket.version>
      </properties>
      
      <dependencyManagement>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>org.springframework.context</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>org.springframework.orm</artifactId>
          <version>${spring.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>com.springsource.org.apache.commons.dbcp</artifactId>
          <version>1.2.2.osgi</version>
          <scope>runtime</scope>
      </dependency>
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>com.springsource.org.apache.commons.pool</artifactId>
          <version>1.5.3</version>
          <scope>runtime</scope>
      </dependency>
      <dependency>
      <groupId>com.mysql.jdbc</groupId>
          <artifactId>com.springsource.com.mysql.jdbc</artifactId>
          <version>5.1.6</version>
      </dependency>
      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>com.springsource.org.hibernate</artifactId>
          <version>3.3.2.GA</version>
      </dependency>
      <dependency>
          <groupId>javax.persistence</groupId>
          <artifactId>com.springsource.javax.persistence</artifactId>
          <version>1.0.0</version>
      </dependency>
      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>com.springsource.org.hibernate.annotations</artifactId>
          <version>3.4.0.GA</version>
          <exclusions>
              <exclusion>
              <groupId>org.apache.commons</groupId>
              <artifactId>com.springsource.org.apache.commons.logging</artifactId>
          </exclusion>
          </exclusions>
      </dependency>
      <dependency>
          <groupId>org.apache.wicket</groupId>
          <artifactId>wicket</artifactId>
          <version>${wicket.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.wicket</groupId>
          <artifactId>wicket-spring</artifactId>
          <version>${wicket.version}</version>
          <exclusions>
              <exclusion>
              <artifactId>spring</artifactId>
              <groupId>org.springframework</groupId>
          </exclusion>
          </exclusions>
      </dependency>
      <dependency>
          <groupId>org.apache.wicket</groupId>
          <artifactId>wicket-extensions</artifactId>
          <version>${wicket.version}</version>
      </dependency>
      

      像这样使用 JPA/Hibernate 注释来注释您的模型类(只是一个显示几个常见结构的示例):

      @Entity(name = "User")
      @Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = { "email" }) })
      @SecondaryTable(name = "user_picture")
      public class User implements Serializable {
      
          @Id
          @GeneratedValue(strategy = GenerationType.AUTO)
          private Long id;
          private String email;
          private String name;
          private String password;
          @Lob
          @Column(table = "users_picture", length = 524288)
          private byte[] picture;
          private Date birthDate;
          private String phonenumber;
          @ManyToOne(fetch = FetchType.EAGER)
          private Address homeAddress;
          @Enumerated(EnumType.STRING)
          private Gender gender;  
          @CollectionOfElements(fetch = FetchType.EAGER)
          @Enumerated(EnumType.STRING)
          private Set<Weekday> workdays = new HashSet<Weekday>();
      

      使用 hibernate3-maven-plugin 从带注释的模型类生成数据库。这是一个巨大的节省时间。数据库是在 maven2 的测试阶段生成的。还有其他插件 (DBUnit) 可以帮助您使用测试数据等填充数据库(您也可以使用老式的 .sql 脚本)。如果您更改模型中的某些内容,更改会自动传播到您的数据库(当然是在 maven 构建之后),这在开发过程中非常有用。

      将此添加到您的 pom 中(我更喜欢制作一个包含前端、后端和 api 模块的多模块 maven 项目;这将进入您的后端 pom):

      <build>
      <plugins>
      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>hibernate3-maven-plugin</artifactId>
          <version>2.0-alpha-1</version>
          <configuration>
              <components>
                  <component>
                  <name>hbm2ddl</name>
                  <implementation>
                      annotationconfiguration
                      </implementation>
              </component>
              </components>
              <componentProperties>
                  <drop>true</drop>
              <jdk5>true</jdk5>
              <propertyfile>
                  target/classes/jdbc.properties
                  </propertyfile>
              <skip>${maven.test.skip}</skip>
              </componentProperties>
              </configuration>
              <executions>
                  <execution>
                  <phase>process-test-resources</phase>
                      <goals>
                      <goal>hbm2ddl</goal>
                  </goals>
                  </execution>
               </executions>
               <dependencies>
                   <dependency>
                   <groupId>mysql</groupId>
                       <artifactId>mysql-connector-java</artifactId>
                       <version>5.0.5</version>
               </dependency>
               </dependencies>
          </plugin>
      </plugins>
      

      生成的表格如下所示:

      +--------------------------------+--------------+------+-----+---------+----------------+
      | Field                          | Type         | Null | Key | Default | Extra          |
      +--------------------------------+--------------+------+-----+---------+----------------+
      | id                             | bigint(20)   | NO   | PRI | NULL    | auto_increment |
      | email                          | varchar(255) | YES  | UNI | NULL    |                |
      | name                           | varchar(255) | YES  |     | NULL    |                |
      | password                       | varchar(255) | YES  |     | NULL    |                |
      | birthDate                      | datetime     | YES  |     | NULL    |                |
      | phonenumber                    | varchar(255) | YES  |     | NULL    |                |
      | gender                         | varchar(255) | YES  |     | NULL    |                |
      | address                        | bigint(20)   | YES  | MUL | NULL    |                |
      +--------------------------------+--------------+------+-----+---------+----------------+
      

      (users_workdays 和 users_picture 是引用此实体的辅助表)

      我所有的例子都是基于使用 MySQL 数据库;您可以用任何旧的 RDBMS 替换。

      我希望这可以帮助你 a) 醒来并闻到灰烬,b) 让你的 Wicket 项目加快 ORM 的速度

      干杯!

      【讨论】:

      • 不是来自 PHP 或 .net,我是一名 Java 开发人员。我不认为说 Spring 有相当大的学习曲线是不合理的,并且涉及到很多奇怪的 XML 配置等。显然,很难将 Roo 描述为复杂的,但是当我开始添加多对一关系时,我立即遇到了脚手架问题,而且当这个项目开始时,我没有看到很多令人放心的文档或支持开始成长——反正还没有。感谢您的回答:我将开始更多地研究这些注释以及 Hibernate 如何使用它们。
      • 这是一个可靠的答案,尽管我通常会跳过 hibernate3-maven-plugin 并在开发中使用 'hibernate.hbm2ddl.auto=update' 属性。这样,我不必在每次构建时都运行 Maven,Hibernate 会为我更新。对于生产,您需要“hibernate.hbm2ddl.auto=validate”。你永远不想让 Hibernate 在你的生产数据集上疯狂(例如,表重命名将被解释为旧表的删除和新表的创建,在此过程中丢失数据)。改为使用 LiquiBase。
      • 谢谢布赖恩!这是一个可靠的评论(-:
      【解决方案3】:

      如果您没有被锁定在 MySQL 中,您可能还想考虑一些 so-called noSQL databases。 Wicket 非常擅长以面向对象的方式做事,如果您不创建需要大量已经接受过 MySQL 等特定技术培训的人员的企业应用程序,您可以通过不采用SQL 路径。

      【讨论】:

      • 你能在网上或自己给我看一个例子吗?
      • Wicket 是一种视图技术,与持久化模型完全不同。 Wicket 不在乎您选择哪种模型,因此任何其他数据库站点中的任何示例都适用于您。
      猜你喜欢
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多