自动设置反向引用

时间:2012-11-15 15:59:55

标签: java spring hibernate jpa aop

我正在使用 Spring JPA Hibernate 开发Java EE应用程序。

在我们的商业模式中,我们有几个反向引用,OneToMany或OneToOne。 我们需要它用于处理目的。

我们最终有许多自动处理反向引用的setter:

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);

如果没有,我想我就要写自己的了。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);