Наследование Java - как установить значение из экземпляра дочернего класса для совместного использования (того же) другими дочерними классами? - PullRequest
0 голосов
/ 30 ноября 2011

Я хотел бы сделать что-то вроде этого:

Class A 
Class B extends A
Class C extends A

B b = new B();
C c = new C();

b->setField("foo");
c->getField; //return "foo"

Возможно ли как-то реализовать эти классы?

Мне нужно это для сохранения в спящем режиме, чтобы разделить сущность на две сущности и иметь каждую в своей таблице. И мне нужно, чтобы некоторые поля были одинаковыми (id, некоторые FK, некоторые значения). Поэтому я хотел бы установить эти поля в одном подклассе и иметь те же значения во втором подклассе. Все подклассы должны иметь / совместно использовать одно и то же значение.

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 30 ноября 2011

Независимо от того, возможно ли это или нет с точки зрения Java (да, но в обходном смысле), это не правильный способ справиться с тем, что вам нужно.Если вы используете внешние ключи и обновляете значение в некотором постоянном объекте, соответствующее значение должно быть обновлено в объектах, которые используют его в качестве внешнего ключа.Просто позвольте JPA / Hibernate позаботиться об этом за вас.Я предлагаю вам прочитать API Java Persistence в Учебном руководстве по Java EE, а также руководство по Hibernate, чтобы узнать, что он делает и как следует обрабатывать / разделять данные между различными классами сущностей и / или таблицами.

РЕДАКТИРОВАТЬ: так как все продолжают говорить о статических полях, которые совсем не то, что ОП хочет , я приведу пример того, как я бы это сделал ...

public class Key {
    private String value;
    public Key(final String value) {
        this.value = vale;
    }
    public String getValue() {
        return value;
    }
    public void setValue(final String value) {
        this.value = value;
    }
}

public class A {
    private final Key field;
    public A(final Key field) {
        this.field = field;
    }
    public setField(final String value) {
        field.setValue(value);
    }
}

public class B {
    private final Key field;
    public B(final Key field) {
        this.field = field;
    }
    public setField(final String value) {
        field.setValue(value);
    }
}

//When using...
Key k = new Key("value");
A a = new A(k);
B b = new B(k);

Но, как я уже сказал, это только решение на уровне Java, но оно не будет работать должным образом в контексте сохранения.Вы должны прочитать об использовании первичных и внешних ключей в отношении JPA и Hibernate.Судя по нотации, использованной в исходном вопросе, я бы сказал, что этот постер не из Java, поэтому важно, чтобы он научился правильно использовать эти технологии, прежде чем случайно изобретать велосипед.

1 голос
/ 30 ноября 2011

Вы можете использовать ниже код:

public class A {

    private static String field;

    public static String getField() {
        return field;
    }

    public static void setField(String field) {
        A.field = field;
    }
}


public class B extends A{

}


public class C extends A{

}


public class Test {

    public static void main(String[] args){
        B.setField("Thank you"); // or 
           new B().setField("Thank you"); 

        System.out.println(C.getField()); // or
            System.out.println(new C().getField());

  // it will work for object and for class as well
    }
}

вывод: Спасибо

1 голос
/ 30 ноября 2011

Hibernate обычно не управляет статическими полями. В этом случае вы можете просто добавить статический метод получения и установки в класс А. Если вы не затеняете их в подклассе (нет переопределения статических методов), вызовите C.setField("foo"), A.setField("foo"), c.setField("foo") (обратите внимание c является экземпляром) и т. Д. Будут вызовами одного и того же метода.

Если вы хотите предоставить общие свойства для ваших сущностей, но сущности могут иметь разные значения, попробуйте использовать аннотацию @MappedSuperClass.

1 голос
/ 30 ноября 2011

Если поле статическое, то они будут иметь одинаковое значение.Не в Hibernate, так что я не уверен, что это что-то меняет с точки зрения персистентности.

1 голос
/ 30 ноября 2011

Вы можете попробовать сделать ваше поле статичным.Тогда вы сможете получить к нему доступ таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...