Java继承-如何将子类实例中的值设置为由其他子类共享(相同)?
我想这样做:Java继承-如何将子类实例中的值设置为由其他子类共享(相同)?,java,oop,inheritance,Java,Oop,Inheritance,我想这样做: 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" 是否有可能实现这些类 我需要它在hibernate中持久化,将实体拆分为两个实体,并将每个实体都放在自己的表中。我需要有一些相同的字段(id,一些FK,一些值)。所以我想在一个子类中设置这些字段,在第二个子类中设置相同的值
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"
是否有可能实现这些类
我需要它在hibernate中持久化,将实体拆分为两个实体,并将每个实体都放在自己的表中。我需要有一些相同的字段(id,一些FK,一些值)。所以我想在一个子类中设置这些字段,在第二个子类中设置相同的值。所有子类都需要具有/共享完全相同的值
有什么想法吗 您可以尝试将字段设置为静态。然后您可以通过这种方式访问它。如果字段是静态的,那么它们将共享相同的值。不支持Hibernate,所以我不确定从持久性的角度看这是否会改变任何东西。无论从Java的角度看这是否可能(是的,但以一种迂回的方式),它都不是处理所需内容的正确方法。如果使用外键并更新某个持久化实体中的值,则应在将其用作外键的实体中更新相应的值。让JPA/Hibernate为您处理这个问题。我建议您阅读JavaEE教程中的JavaPersistenceAPI以及Hibernate指南,了解它的功能以及如何处理跨不同实体类和/或表共享/划分的数据 编辑:由于每个人都在反复讨论静态字段,这完全不是OP想要的,,因此我将提供一个示例,说明我将如何做到这一点
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背景,因此在意外地重新发明轮子之前,他必须学会如何正确使用这些技术。Hibernate通常不会管理静态字段。在这种情况下,您可以只向类a添加一个静态getter和setter。如果您不将它们隐藏在子类中(没有静态方法的重写),则调用
C.setField(“foo”)
,a.setField(“foo”)
,C.setField(“foo”)
(注意C
是一个实例)等都将调用同一个方法
如果您想为实体提供公共属性,但实体可以有不同的值,请尝试使用
@MappedSuperClass
注释。您可以使用以下代码:
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
}
}
输出:谢谢该字段是静态的吗?如果没有,对象
b
和c
如何共享该值?这将为该类的每个实例设置值。看看这是如何处理JPA持久性的,这根本不是OP想要的,而且会带来一个重大问题。是的,伙计,你是对的。静态场的答案是我想要的,我完全错过了这种方式。但你是对的,我不能用它来解决我的问题。我将检查dku.rajkumar ass acceptet先生的答案,因为这是第一部分od问题的正确答案-是可能的。但非常感谢你写得很好的回答,它激励我寻找另一个解决方案。