2011-10-21 11 views
0

私はテーブルAとテーブルBを1対多数の関係で2つ持っています。両方のテーブルには、自動的にインクリメントされるidフィールドがあります。また、テーブルBは、外部キーフィールド参照テーブルAのidフィールドを有する。多対1の関係で派生した自動インクリメントIDを記入することはできますか?

CREATE TABLE A (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `afield` varchar(255), 
    PRIMARY KEY (`id`) 
) ; 

CREATE TABLE B (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `aId` INT NOT NULL, 
    `bfield` varchar(255), 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`aId`)REFERENCES A(`id`) ON DELETE CASCADE 
) ; 

クラス:ここ

は、MySQL DBのテーブルスキーマである

@Entity 
@Table(name = "A") 
public class A implements java.io.Serializable { 

    private Integer id; 
    private String aField; 

    private List b; 

    public A() {} 

    public A(Integer id) { 
     this.id = id; 
    } 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @GenericGenerator(name = "generator", strategy = "native") 
    @GeneratedValue(generator = "generator") 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name = "AFIELD", length = 50) 
    public String getAField() { 
     return this.aField; 
    } 

    public void setAField(String aField) { 
     this.aField = aField; 
    } 

    //mapped by = "a" a is a field in B. Case sensetive @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "a") 
    public List getB() { 
     return b; 
    } 

    public void setB(List b) { 
     this.b = b; 
    } 
} 

@Entity 
@Table(name = "B") 
public class B implements java.io.Serializable { 

    private String bField; 
    private Integer id; 
    private Integer aId; 

    private A a; 

    public B() {} 

    @Id 
    @Column(name = "id", unique = true, nullable = false) 
    @GenericGenerator(name = "generator", strategy = "native") 
    @GeneratedValue(generator = "generator") 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name = "aId") 
    public Integer getAId() { 
     return this.aId; 
    } 

    public void setAId(Integer aId) { 
     this.aId = aId; 
    } 

    @Column(name = "BFIELD", length = 50) 
    public String getBField() { 
     return this.bField; 
    } 

    public void setBField(String bField) { 
     this.bField = bField; 
    } 

    @ManyToOne 
    @JoinColumn(name = "aId", insertable = false, updatable = false) 
    public A getA() { 
     return a; 
    } 

    public void setA(A a) { 
     this.a = a; 
    } 
} 

以下は、私の試験方法である:コメントアウト三行で

public static void main(String[] args) { 
    try { 
     Configuration cfg = new Configuration().configure(); 
     SessionFactory factory = cfg.buildSessionFactory(); 
     Session sess = factory.getCurrentSession(); 
     Transaction tx = sess.beginTransaction(); 
     A a = new A(); 
     a.setAField("afield"); 
     // sess.save(a); 
     // sess.flush(); 

     List <B> bs = new ArrayList <B>(); 
     a.setB(bs); 
     B b = new B(); 
     b.setBField("bfield"); 
     // b.setAId(a.getId()); 
     bs.add(b); 

     sess.saveOrUpdate(a); 
     tx.commit(); 
     factory.close(); 
    } catch (Throwable ex) { 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

有効にすると、正常に動作します。基本的には、オブジェクトaからidを取得し、それをオブジェクトbに設定します。

しかし、私はbオブジェクトのリストを保存する前にオブジェクトを保存する必要があります。それは3つのコメントアウトされた行なしで動作するとにかくありますか?シナリオは、2つのオブジェクトの関係の詳細を知らず、スキーマも知らないので、オブジェクトaを作成してリストオブジェクトbを設定してからオブジェクトaを保存するというシナリオです。

ご協力いただきありがとうございます。

答えて

0

提出する前に、質問の書式を設定してください。

説明:テーブルBのaId列は、aIdフィールドで1回、aで1回マップされます。このaIdの列は消えます。あなたはBからAへの関連付けしかしてはいけません。AのフォームBのIDが必要な場合は、b.getA().getId()と呼んでください。

その他の重要な点は、双方向の関連付けがあることです。エンティティグラフが一貫していることを確認する必要があります。あなたがAのBsのリストにBを追加した場合、あなたはまた、Bのフィールドを設定する必要があります。

a.getBs().add(b); 
b.setA(a); 

をHibernateが唯一持続するかを知るために協会の片側に見えます。この側はmappedBy属性を持たない側です。これは、それが機能するようにあなたは絶対にb.setA(a)に電話しなければならないことを意味します。

+0

返信いただきありがとうございます。私は失われてしまうのではないかと心配しています。あなたは私がb.setA(a)を使用する必要があると思っています。実際には、通常の状況ではそれを行う必要はありません。 AとBの両方を問題なく持続させるために、AのBリストを設定する必要があります。この問題は、AIDがAの主キーでネイティブに生成された場合にのみ発生します。 – user1007852

+0

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional双方向1対多の関連付けをどのようにマッピングするかを調べます。所有側は、Hibernateが関連が存在するかどうかを判断するために使用する側です。それは初期化されなければならない。 –

関連する問題