-1
public class Userr extends Model{
    @Id
    public Long id;
    @OneToMany
    List<Badge> badges;
}

public class Badge extends Model{
    @Id
    public Long id;
    @ManyToOne
    Userr user;
}

これらは私の2つのモデルであり、これは生成されたエラーです:

[RuntimeException : java.lang.IllegalArgumentException: クエリがスローしましたSQLException:列"T1.USERR_ID"が見つかりません。SQL ステートメント: select t0.id c0 , t1.id_ c1, t1.name_ c2, t1.desc_ c3, t1.img_url_ c4, t1.effect_ c5, t1.user_id c6 from userr t0 left outer join badge t1 on t1.userr_id = t0.id where t0.id = ? order by t0.id[42122-168] バインド値:[ null] クエリ: select t0.id c0 , t1.id_ c1, t1.name_ c2, t1.desc_ c3, t1.img_url_ c4, t1.effect_ c5, t1.user_id c6 from userr t0 left outer join badge t1 on t1.userr_id = t0.id where t0.id = ? order by t0.id(参照チェーン経由: com.avaje.ebean.common.BeanList[0]->models.Userr["created_badges"]) ]

私のfindAllモデルuserr_idファイルuser_id では、フィールドがuser_id.

に変更userしてみuserrましたが、翻訳されたのでうまくいきました<classname>_id

これはバグですか?または私はそれを間違って使用していますか?

4

1 に答える 1

1

これはバグではありません。これは、DDL 生成パターンのデフォルトの動作です。一般的に発生する可能性のあるケースについて説明します。

1st case: データベースで前にテーブルを作成していません

既存のテーブルを使用せずに最初にアプリケーションをビルドする場合、以前に直面した問題は発生しないと思います (デフォルトの構成値を使用し、アプリケーションを DEV モードに設定する限り)。単刀直入に言うと、以前のような 2 つのモデルがあるとします。

@Entity
public class Userr extends Model {
    @Id
    public Long id;
    public String realName;
    @OneToMany
    List<Badge> badges;
}

@Entity
public class Badge extends Model {
    @Id
    public Long id;
    @ManyToOne
    Userr user;
}

アプリケーションを実行すると、フレームワークは DDL 生成パターンに、接続されたデータベースを調べて and という名前のテーブルがあるかどうかを確認するよう指示する必要がありuserrますbadge。以前にこれらのテーブルを作成したことがないため、フレームワークはこれら 2 つのテーブルをデータベースに自動的に生成します。モデルに基づいて、フレームワークは (PostgreSQL スクリプト) のようなスクリプトを使用してテーブルを生成します。

-- the java class name is 'Userr' generated as 'userr'
CREATE TABLE userr {
    -- long on java generated as bigint
    id        bigint,
    -- 'realName' on java generated as 'realname' and string on java generated as varchar whose length 255 
    realname  character varying(255),
    -- one to many 'badges' field is not generated
    CONSTRAINT pk_userr PRIMARY KEY (id), -- id as primary key
}
-- the java class name is 'Badge' generated as 'badge'
CREATE TABLE badge {
    id        bigint,
    -- 'Userr' Object with MayToOne relation generated as the foreign key to the id on 'userr' table
    userr_id  bigint,
    CONSTRAINT pk_badge PRIMARY KEY (id),                      
    CONSTRAINT fk_badge_userr FOREIGN KEY (userr_id)
       REFERENCES userr (id) MATCH SIMPLE
       ON UPDATE NO ACTION ON DELETE NO ACTION,

}

2nd case: データベースに既存のテーブルがあります

以前に と という名前の 2 つのテーブルがあるuser_accountとしbadgeます。表は次のuser_accountようになります。

CREATE TABLE user_account {
    id        bigint,
    real_name character varying(100),
    CONSTRAINT pk_userr PRIMARY KEY (id),
}
CREATE TABLE badge {
    id        bigint,
    user_id   bigint,
    CONSTRAINT pk_badge PRIMARY KEY (id),                      
    CONSTRAINT fk_badge_user_account FOREIGN KEY (user_id)
       REFERENCES user_account (id) MATCH SIMPLE
       ON UPDATE NO ACTION ON DELETE NO ACTION,
}

次のようなコードを使用することで、以前のモデルを(いくつかの変更を加えて)正しく使用して、現在のテーブルを操作できます。

@javax.persistence.Entity
// define this model as table named 'user_account'
@javax.persistence.Table(name = "user_account")
public class Userr extends Model {
    @Id
    public Long id;
    // define this field as column named 'real_name' whose length is 100
    @javax.persistence.Column(name = "real_name", length = 100)
    public String realName;
    @OneToMany
    List<Badge> badges;
}

@javax.persistence.Entity
public class Badge extends Model {
    @Id
    public Long id;
    @ManyToOne
    // define this field as column named 'user_id' and 
    // this act as reference to model 'Userr' using field named 'id' on it
    @javax.persistence.JoinColumn(name = "user_id", referencedColumnName = "id")
    Userr user;
}

これが、DDL 生成パターンをよりよく理解するのに役立つことを願っています.. :)

于 2013-04-26T00:29:52.517 に答える