我正在使用 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);
如果没有,我想我就要写自己的了。
答案 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);