我可以使用EclipseLink直接在实体构造函数中引用属性吗?

时间:2017-03-08 19:30:02

标签: eclipselink

EclipseLink版本为2.5.1

我们已从GlassFish网络服务器迁移到TomCat。这使我们转向静态编织,因为使用TomCat动态编织并不是那么容易。 现在静态编织工作,它似乎工作有点不同。 如果我有一个实体直接在构造函数中设置一些属性:

class Entity {
    @Column
    private String name;

    public Entity() {
        name = "something";
    }

    public String getName() {
        return name;
    }
}

长话短说这个测试会失败:

Entity e = new Entity();
assertEquals("something", e.getName()); // e.getName() returns null

这是因为getName()在编织后不再返回this.name。相反,它调用路由进行初始化(如果需要)和(我猜)从一些底层HashMap获取属性的值。 但是构造函数没有被编织,我甚至已经研究了织工的来源,似乎明确地选择了这个:

/**
 * Construct a MethodWeaver and allow it to process the method.
 */
@Override
public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) {
    MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions);
    if (!alreadyWeaved) {
        // skip constructors, they will not changed
        if (!"<init>".equals(methodName) && !"<cinit>".equals(methodName)) {
            // remaining modifications to the 'body' of the class are
            // delegated to MethodWeaver
            mv = new MethodWeaver(this, methodName, desc, mv);
        }
    }
    return mv;
}

问题是,也许我想念一下这里?使用EclipseLink 2.5.1的实际情况是,您不能直接在实体自己的ctor中使用属性吗? (它甚至没有在任何地方被提及,至少不可论证)

1 个答案:

答案 0 :(得分:0)

事实证明是的,我们可以。

但是有一个问题导致我们的财产对吸气剂不可见。 我们实际上在这里有MappedSuperclass继承,我们在子类中隐藏了这个字段。基本上就是这样:

class A {
    @Column()
    protected String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class B extends A {
    @Column()
    protected String name;

    // no @Override here
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

所以我们只是在遮蔽财产。