Java的类似学说的数组访问

时间:2011-04-14 12:04:28

标签: java orm

我计划将PHP格式转换为Java编写数据驱动的Web应用程序。我显然希望有一个处理持久数据的图层。在使用Doctrine(1.x)的PHP中,可以通过单个接口(PHP的ArrayAccess)完成以下操作:

  • 在代码
  • 中表示数据结构
  • 从数据库通过Doctrine
  • 获取结构化数据
  • 以HTML格式表示结构化数据

因此,我必须拥有一个表格层,如:

$properties = array (
    "minlength" => 2,
    "maxlength" => 30,
);
new TextInput ("name", $properties);

......对于底层机制一无所知。它可以通过单个接口从上面的所有源加载和保存(可能是结构化的)数据。

将数据保存到记录时,无法调用setName($value)。它只能调用set("name", $value)。 (当然可以通过反思来完成,但我希望我不必详细说明为什么这是一个坏主意。)

Java中是否有任何ORM:

  • 实现本机集合接口。例如java.util.Map
  • 将数据库关系映射为author.get("books").put(newBook)
  • 等集合
  • 具有实现复杂逻辑的正确触发器(如附加到字段的权限或外部文件)。

3 个答案:

答案 0 :(得分:2)

POJO classess的地图访问可以通过Hibernate的ClassMetadata界面实现Map的超类来实现,如:

abstract class MappedRecord implements java.util.Map<String, Object> {

    private ClassMetadata classMeta;

    public MappedRecord() {
        classMeta = mySessionFactory.getClassMetadata(this.getClass());
    }

    public Object put(String s, Object o) {
        classMeta.setPropertyValue(this, s, o, EntityMode.POJO);
    }
}

然后,当您在持久化类中扩展MappedRecord时,可以调用:

User u = new User();
u.put("name", "John");

安全地获取mySessionFactory是一个棘手的问题;

答案 1 :(得分:1)

您可能需要查看Hibernate和JPA

答案 2 :(得分:1)

我认为NHibernate是选择,但我不确定我是否有关于触发器的要求。我认为,这是一个应用层,而不是ORM层。