3

SpringJPAHibernateを使用して Java EE アプリケーションを開発しています。

私たちのビジネス モデルでは、OneToMany または OneToOne のいずれかの複数の後方参照があります。処理目的で必要です。

後方参照を自動的に処理する多くのセッターを持つことになります:

class Dog {

    @OneToOne
    private DogOwner owner;

    public void setOwner(DogOwner owner) {
       this.owner = owner;
       if (!this.owner.getDog().equal(this)) {
          owner.setDog(this);
       }
    }

    [...]
 }

class DogOwner {

    @OneToOne(mappedBy="owner")
    private Dog dog;

    public void setDog(Dog dog) {
       this.dog = dog;
       if (!this.dog.getOwner().equal(this)) {
          dog.setOwner(this)
       }
    }

    [...]
 }

セット/リストのOneToManyアソシエーションとメソッドについても同じことが言えます。add()

これは機能しますが、すべての後方参照に対してこれらの自動セッターを記述するのは少し面倒で、エラーが発生しやすくなります。

JPAには必要なすべての注釈があり、Spring / OAPの力を備えているため、それを自動的に処理できる構成またはフレームワークがありますか?

編集:例

明確にするために、「永続化」を行う前であっても、モデル内で後方参照が自動的に一貫性を保つことを望みます。

これが私が望む動作です:

Dog rex = new Dog();
Dog mirza = new Dog();
DogOwner bob = new DogOwner();

bob.setDog(rex);
assert(rex.getOwner() == bob);

bob.setDog(mirza);
assert(rex.getOwner() == null);
assert(mirza.getOwner() == bob);

そうでない場合は、自分で書き込もうとしていると思います。

4

2 に答える 2

0

逆 relp が適切に機能していることを確認する必要があります。これを試すことができます:

@OneToOne
@JoinColumn(name="OWNER_ID", unique= true, nullable=true, insertable=true, updatable=true)
private DogOwner owner;

それは次のとおりです: JPA/OneToOneMappingBidirectional.htm">http://www.java2s.com/Tutorial/Java/0355_JPA/OneToOneMappingBidirectional.htm

于 2012-11-15T19:18:14.510 に答える
0

自動的に後方参照を行うとは思えません。overload constructor私は自分の経験に基づいて、そのために使用します。

public class DogOwner {
    private Dog dog;

    public DogOwner () {
    }

    public DogOwner (Dog dog) {
        this.dog = dog;
        dog.setDogOwner(this);
    }
    //getter and setter
}

public class Dog {
    private DogOwner dogOwner;

    public Dog() {
    }
    //getter and setter
}

その場合、以下のように初期化コードを減らすことができます。

Dog d = new Dog();
DogOwner owner = new DogOwner(d);
于 2012-11-16T10:34:42.247 に答える