我正在用Spring、JPA、Hibernate开发Java应用程序。
在我们的业务模型中,我们有几个反向引用,要么是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);如果没有,我想我就要写我自己的了。
发布于 2012-11-15 19:18:14
您需要确保逆relp正常工作。可以试试这个:
@OneToOne
@JoinColumn(name="OWNER_ID", unique= true, nullable=true, insertable=true, updatable=true)
private DogOwner owner;这就是: JPA/OneToOneMappingBidirectional.htm">JPA/OneToOneMappingBidirectional.htm
发布于 2012-11-16 10:34:42
我不认为会自动进行回溯。根据我的经验,我使用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);https://stackoverflow.com/questions/13401364
复制相似问题