我有一个无法更改的旧架构.我正在使用基类来实现常见功能,它包含一个嵌入式对象.有一个字段通常映射在嵌入对象中,该字段只需要在一个(很多)子类的持久性ID中.我创建了一个包含它的新id类,但后来我得到了该字段映射两次的错误.下面是一些简化的示例代码,以保持读者的理智:
@MappedSuperclass
class BaseClass {
@Embedded
private Data data;
}
@Entity
class SubClass extends BaseClass {
@EmbeddedId
private SubClassId id;
}
@Embeddable
class Data {
private int location;
private String name;
}
@Embeddable
class SubClassId {
private int thingy;
private int location;
}
Run Code Online (Sandbox Code Playgroud)
我试过@AttributeOverride,但我只能重命名该字段.我试图将它设置为updatable = false,insertable = false但是当在@AttributeOverride注释中使用时,这似乎不起作用.有关此问题的解决方案,请参阅下面的答案.
我意识到我可以改变基类,但我真的不想拆分嵌入对象来分离共享字段,因为它会使周围的代码更复杂,并且需要一些丑陋的包装代码.我也可以为这个角落案例重新设计整个系统,但我真的不愿意.
我使用Hibernate作为我的JPA提供程序.
我是Java中自动装箱的忠实粉丝,因为它节省了许多丑陋的锅炉板代码.但是我发现自动取消装箱在某些可能为null的情况下会引起混淆.有没有办法检测代码库中带有javac警告的自动拆箱位置?任何其他解决方案来检测仅出现拆箱(例如FindBugs或特定于Eclipse的编译器警告)将不胜感激,因为我找不到任何解决方案.
为了澄清我不希望在拳击上生成任何警告 - 仅取消装箱.
下面是一些可能导致混淆NullPointerExceptions的代码的简单示例:
class Test {
private Integer value;
public int getValue() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud) 我有两个A和B类如下:
public class A {
private int salary = 0;
protected void calculate() {
salary = 400;
}
protected A() {
calculate();
}
}
public class B extends A {
private int salary = 0; // (1)
protected void calculate() {
System.out.println("calculating salary...");
salary = 700;
}
public static void main(String[] args) {
System.out.println(new B().salary); // (2)
}
}
Run Code Online (Sandbox Code Playgroud)
考虑第(2)行:我不明白为什么new B().salary有效,因为第(1)行中的工资的说明符是private.你能帮我解释一下吗?