1

私は過去数年間、主にActiveRecordを使用して、Rubyですべてのデータベース開発を行ってきました。今、私はプロジェクトに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エントリを作成する必要があります。

もちろん、実際の生活では、それは2つのテーブル以上のものであり、痛みは指数関数的に増大します。確かにもっと良い方法がありますか?

4

5 に答える 5

3

Java用のORMソリューションを使用できます。さまざまなソリューションを利用できます。

見る価値のあるリンク:

そうは言っても、私は通常、複雑なアプリケーションの場合、ORMが価値以上の問題を引き起こすことがよくあります(もちろん、これにはActiverecordを使用したRubyプロジェクトも含まれます)。オブジェクト指向のファサードを強制的に追加するのではなく、SQLを介してデータを直接取得することが実際に理にかなっている場合があります。

于 2012-07-16T08:58:30.463 に答える
2

より良い方法はSQLを学ぶことです!あなたがとても好きなORMは、舞台裏であなたのためにSQLを書きます。

したがって、レコードを選択しようとするクイックヘルパー関数を作成できます。レコードが存在しない場合は、レコードが作成されます。

MySQLではINSERT IGNORE .....、行が存在しない場合にのみ行を挿入するを使用できます。

そして、ここにあなたが好きかもしれない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フィールドを取得できます。そして、すべてを1ビットのSQLで。

SQLは非常に優れた言語です。ormの疑似言語に依存するのではなく、SQLを学ぶ必要があります。

于 2012-07-16T08:56:27.200 に答える
1

JDBCを使用している場合は、自分で検索し、存在しない場合は人を作成する必要があります。JDBCを使用する場合、これ以上の方法はありません。

ただし、Hibernateを使用することはできます。これにより、ORマッピングを自分で作成する手間を省き、定型文を減らすことができます。

あなたがRubyから来て、すべてのSQLクエリ、JDBC定型文を書くのが面倒だと思うなら、より良い方法はORMを使うことです。次のいずれかをお勧めします、

  1. Hibernate
  2. JPA(ORM実装を変更する場合は、JPAを使用してください)
于 2012-07-16T08:57:13.447 に答える
0

Sormulaにはアクティブレコードパッケージが含まれています。saveメソッドは、既存のレコードを更新するか、レコードが存在しない場合は挿入します。

Webサイトのアクティブレコードの例を参照してください。

プロジェクト内の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 に答える