Hibernate vs. Rails:数据持久化
显式定义的价值
那么什么是显式定义的价值呢?Rails的活动记录的关键特性之一就是不需要为类指定字段,而这一切由Rails根据数据表中的字段动态确定。也就是说,当数据表改变后,无需改变类定义即可和数据表保持一至。如果你有一个叫“miners”的表,它的定义如下:
相应的ruby类(miner.rb)和这个类的用法如下:create table miners (
id BIGINT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(255),
last_name VARCHAR(255),
primary key (id)
)
和Rails不同,Hibernate类(Miner.java)需要指定字段、getters和setters方法以及xdoclet标签,代码如下:class Miner < ActiveRecord::Base
end
![]()
miner.first_name = "Brom"
在这之前我已经提到,Rails和Hibernate都需要指定字段名。所不同的是,Hibernate的字段是在代码中指定,而Rails的活动记录是根据数据表的字段动态指定的。即Hibernate是静态的,而活动记录是动态的。所以当你查看Ruby代码时,你将看到…package deadwood;
/**//**
* @hibernate.class table="miners"
*/
public class Miner ...{
private Long id;
private String firstName;
private String lastName;
/**//**
* @hibernate.id generator-class="native"
*/
public Long getId() ...{ return id; }
public void setId(Long id) ...{ this.id = id; }
![]()
/**//**
* @hibernate.property column="first_name"
*/
public String getFirstName() ...{ return firstName; }
public void setFirstName(String firstName) ...{ this.firstName = firstName; }
![]()
/**//**
* @hibernate.property column="last_name"
*/
public String getLastName() ...{ return lastName; }
public void setLastName(String lastName) ...{ this.lastName = lastName; }
}
![]()
miner.setFirstName("Brom");
Rails虽然在映射字段方面很简单,但问题是我们怎么知识对象中有多少个字段?当然,为了知道答案,你必须启动MySQL或其它数据库的前端管理程序,查看数据库表中到底有哪些字段。当数据库中的表或视图比较少时,这当然不是问题。但是当你的工程中的表或视图超过40个或更多时,这将是非常令人痛苦的事情。至于开发人员具体喜欢哪种方式,这可能取决于它们的偏好。但可以肯定地说,将要映射的字段显式地定义在代码中将更容易理解和修改。class GoldClaim < ActiveRecord::Base
end
0
相关文章
