【问题标题】:Spring @Autowired annotation. How to create object that have relation to object in db?Spring @Autowired 注释。如何创建与数据库中的对象相关的对象?
【发布时间】:2015-01-15 19:28:05
【问题描述】:

我有与存储在数据库中的其他对象相关的实体模型。 当我第一个对象时,我在构造函数中添加了另一个对象的 id。 但是当我构造函数体时,我必须从 db 整个对象(第二个)中获取并将其签名为关系。在模型中使用 dao 给了我nullPointerException。 我怎样才能做到这一点?

这里是构造函数:

@Transient @Autowired public SkeletonElementDao skeletonElementDao;


public SkeletonElement(Long id, String name, Long parent_id) {
    super(id, name);
    SkeletonElement parentSkeletonElement = null;
    try {
        parentSkeletonElement = skeletonElementDao.get(parent_id);
    } catch(NullPointerException e) {
        System.out.println("Creating element without parent_old   ");
    } finally {
        this.setParent(parentSkeletonElement);
    }
}

请帮忙。

【问题讨论】:

  • Spring 如何在调用构造函数之前自动装配字段?
  • 我不知道。但我有类似的事情要做:D
  • 使用构造函数注入。
  • 您的实体不应依赖于 DAO。 JPA 创建您的实体,而不是 Spring。构造函数的调用者应该是使用 DAO 获取父对象并将父对象而不是其 ID 传递给构造函数的调用者。
  • 我以为一直在这样做。你能给我一些代码示例吗?我必须以某种方式在构造函数中找到 dao。

标签: spring constructor dependency-injection autowired


【解决方案1】:

试试@PostConstruct 注解。 Spring 只能在调用构造函数后自动连接字段。

@Transient @Autowired public SkeletonElementDao skeletonElementDao;

public SkeletonElement(Long id, String name, Long parent_id) {
    super(id, name);
    //Store these to private final fields
}

@PostConstruct
public void init() {
    SkeletonElement parentSkeletonElement = null;
    try {
        parentSkeletonElement = skeletonElementDao.get(parent_id);
    } catch(NullPointerException e) {
        System.out.println("Creating element without parent_old   ");
    } finally {
        this.setParent(parentSkeletonElement);
    }
}

其他方式是使用constructor injection

【讨论】:

  • 它不起作用,因为在 inint() 方法中我无权访问skeletonElementDao 对象。它必须在模型类之外完成
  • “你没有访问权限”,如“我不能在那里使用它”,或者“它不在那里”,应该在 init() 方法运行之前注入 BC skeletonElementDao。
  • 我认为应该向构造函数注入一个准备好的父对象,因为它是 JB Nizet 在其中一个答案中指向我的。我认为skeletonElementDao 只存在于@Controller 带注释的类中。不在模型课上!
猜你喜欢
  • 2022-12-16
  • 2020-12-23
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 2022-11-23
相关资源
最近更新 更多