Re: 有什么RoR的特性是Java模仿不了的?

阅读更多
这几天潜心研究了一下Hibernate, Spring, ASM, Java5 Instrumentation。 恩,大概列出了这些技术来,明眼人就知道我要干啥了。没错,万恶的元编程,我最痛恨的元编程要登场了。我痛恨元编程,是因为我认为它的能力超越了人类大脑的范围。但是,Java想要在语法上能有超越,唯一的办法就是元编程了。在Java中做元编程有两种方式:
1、操作字节码
比如 AspectJ
2、用动态派生的类替换基类
比如 Spring AOP,Hibernate的Lazy Loading
后者能够达到的能力基本上已经被利用尽了。我感觉,要想突围,不妨就像AspectJ一样,走到字节码这个层面去。由于robbin给的挑战题目是去Active Record相关的,大家对于RoR的很多热情也投注在Active Record上,那我就从Hibernate用法简化入手吧。现在没有实现所有的功能,但是可以给大家看一个样子:

Hibernate配置文件,放在classpath根目录下
Hibernate.properties

connection.driver_class=org.hsqldb.jdbcDriver
connection.url=jdbc:hsqldb:mem:spike
dialect=org.hibernate.dialect.HSQLDialect


User.java

public class User extends Entity {

	public String username;

	public String password;
}


业务类
Authentication.java

@Reborn
public class Authentication {

	public static void register(String username, String password) {
		User user = new User();
		user.username = username;
		user.password = password;
		user.save();
	}

	public static boolean login(String username, String password) {
		User user = new User();
		return user.find(user.username == username, user.password == password).size() > 0;
	}
}


演示代码
RebornDemo.java

public class RebornDemo {

	private void demo() {
		System.out.println(Authentication.login("taowen", "password"));
		Authentication.register("taowen", "password");
		System.out.println(Authentication.login("taowen", "password"));
	}

	public static void main(String[] args) throws IOException {
		new RebornDemo().demo();
	}
}


恩,这就是所有的代码了。能够想到的在语法上更进一步的就是把extends Entity变成implements Entity,但是这样的化必须用User.create() 来替换new User()了。

简化的地方:
1、Id字段自动插入
2、Entity自动标识
3、自动添加annotatedClass
4、hbm2ddl.auto缺省为create
5、hibernate.properties的每行自动添加hibernate.前缀
6、利用强类型的查询语法糖(user.username=="taowen")来代替基于字符串的HSQL

代价:
1、使用了强类型的查询语法糖的类要标记为reborn
2、在User和Entity之间使用了extends的关系

你可能感兴趣的:(Java,Hibernate,编程,Spring,ActiveRecord)