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

我认为不会自动进行反向引用。根据我的经验,我使用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 回答
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 回答