1

在过去的几年里,我用 Ruby 完成了我所有的数据库开发,主要是使用 ActiveRecord。现在我被困在一个项目中使用Java,感觉如此冗长和笨拙,我想知道我是否做错了。

在 ORM 范式中,如果我想插入相关表,我会这样

# Joe Bob got a new car
p = Person.find_or_create_by_name("Joe Bob");
Car.new({:make=>"Toyota", :plate=>"ABC 123", :owner=>p});

在 Java 中,至少直接使用 JDBC,我将不得不手动进行 Person 查找,如果不存在则插入,然后创建 Car 条目。

当然,在现实生活中,不仅仅是两张桌子,而且痛苦呈指数级增长。肯定有更好的方法吗?

4

5 回答 5

3

您可以使用 Java 的 ORM 解决方案 - 有各种可用的解决方案。

值得一看的链接:

话虽如此,我通常发现对于复杂的应用程序,ORM 经常会带来比其价值更多的麻烦(是的,这确实包括带有 Activerecord 的 Ruby 项目)。有时,直接通过 SQL 获取数据而不是试图在其之上强制使用面向对象的外观确实很有意义。

于 2012-07-16T08:58:30.463 回答
2

更好的方法是学习 SQL!你非常喜欢的 ORM 在幕后为你编写 SQL。

因此,您可以创建一个快速帮助函数来尝试选择记录,如果它不存在,则为您创建它。

在 MySQL 中,您可以使用INSERT IGNORE .....which 仅在行不存在时才插入该行。

这里有一段你可能喜欢的特殊 SQL(仅限 MySQL):

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

这会尝试插入记录,如果它不存在,它会像往常一样返回您在程序中检索的 auto_increment。

但是:如果它确实存在,那么它会更新它 - (在这种情况下,只有 c 被设置为更新),但很酷的部分是它设置LAST_INSERT_ID()就像在插入时一样。

因此,无论哪种方式,您都会获得 ID 字段。所有这些都在一个 SQL 中。

SQL 是一门非常好的语言——你应该学习它而不是依赖 orm 的伪语言。

于 2012-07-16T08:56:27.200 回答
1

如果您使用的是 JDBC,则需要自己查找并创建人员(如果不存在)。如果您使用 JDBC,则没有更好的方法。

但是您可以使用 Hibernate,它将帮助您减少自己编写 OR 映射并减少样板。

由于您来自 Ruby,如果您发现编写所有 SQL 查询、JDBC 样板文件很痛苦,那么更好的方法是使用 ORM。我推荐以下之一,

  1. 休眠
  2. JPA(如果要更改 ORM 实现,请使用 JPA)
于 2012-07-16T08:57:13.447 回答
0

Sormula 包含一个活动记录包。如果不存在记录,save 方法将更新现有记录或插入。

请参阅网站上的活动记录示例。

另请参阅项目中的 org.sormula.tests.active.SaveTest.java:

SormulaTestAR record = new SormulaTestAR();  
record.attach(getActiveDatabase()); // record needs to know data source
record.setId(8002);
record.setType(8);
record.setDescription("Save one AR 2");
record.save();
于 2012-07-16T17:56:09.320 回答
0

看起来我来晚了,但是,ActiveJDBC 会在 Java 中做你想做的事情:

Person p = Person.findOrCreateIt("name", "Joe Bob");
Car car = Car.createIt("make", "Toyota", "plate", "ABC 123", "owner", p);

它可以做的还有很多,请查看:http: //javalite.io/

于 2018-12-31T03:23:42.620 回答