【问题标题】:Setting backreference automagically自动设置反向引用
【发布时间】:2012-11-15 15:59:54
【问题描述】:

我正在使用 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);

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

【问题讨论】:

  • 我错过了你的问题。你的目标是什么?
  • 您知道从技术上讲您不必修改非拥有方(带有mappedBy 的一方)?仅使用拥有方。
  • @CycDemo,请参阅我编辑中的示例。

标签: java spring hibernate jpa aop


【解决方案1】:

您需要确保反向 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2012-09-07
      • 2012-03-19
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多