Java Hibernate不通过主键连接
(我知道这不是第一次被问到这个问题,但我尝试了所有建议的解决方案,但没有效果。) 因此,我有一个父实体和一个具有OneToOne映射的子实体-问题是连接不是(也不应该)由主键列完成,而是由其他id列(可为空的自然id)完成 我在这里有4个相关实体:Java Hibernate不通过主键连接,java,hibernate,hibernate-mapping,one-to-one,Java,Hibernate,Hibernate Mapping,One To One,(我知道这不是第一次被问到这个问题,但我尝试了所有建议的解决方案,但没有效果。) 因此,我有一个父实体和一个具有OneToOne映射的子实体-问题是连接不是(也不应该)由主键列完成,而是由其他id列(可为空的自然id)完成 我在这里有4个相关实体: class EntityId implements Serializable { int storeId; long uniqueId; } @Entity @IdClass(EntityId.class) @Immutable @
class EntityId implements Serializable {
int storeId;
long uniqueId;
}
@Entity
@IdClass(EntityId.class)
@Immutable
@Table(name = "parent")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
discriminatorType = DiscriminatorType.STRING,
name = "disc_type"
)
public class Parent {
@Id
@Column(name = "store_id")
private int storeId;
@Id
@Column(name = "unique_id")
private long uniqueId;
// getters and setters omitted for brevity
}
@Entity
@DiscriminatorValue(value = "Extended")
public class ExtendedParent extends Parent {
@Column(name = "id", unique = true, nullable = false)
private Long id;
@OneToOne(mappedBy="parent")
@Fetch(FetchMode.JOIN)
private ExtendedChild child;
// getters and setters omitted for brevity
}
@Immutable
@MappedSuperclass
public abstract class AbstractChild {
@Id
@Column(name = "id", nullable = false)
private long id;
// getters and setters omitted for brevity
}
@Entity
@Table(name = "extended_child")
public class ExtendedChild extends AbstractChild {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)
private ExtendedParent parent;
}
不幸的是,每当我尝试启动应用程序时,它都会出现“无法加载应用程序上下文”的错误,错误如下:
原因:java.lang.ArrayIndexOutOfBoundsException:1
位于org.hibernate.sql.ANSIJoinFragment.addJoin(ANSIJoinFragment.java:81)
位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.addJoins(LoadQueryJoinAndFetchProcessor.java:281)
位于org.hibernate.loader.plan.exec.internal.LoadQueryJoinAndFetchProcessor.renderEntityJoin(LoadQueryJoinAndFetchProcessor.java:184)
问题在于,它只是忽略了referencedColumnName,并尝试通过主键进行连接—当我们进一步研究时可见(异常行中的断点—这是根本原因):
左侧联接中联接的右侧(忽略列的名称)包括定义为父级的@Id的列,而不是在ExtendedParent实体中定义的“Id”列,如ExtendedChild实体中的@JoinColumn中定义的
注意:我还尝试使用@naturaid注释将id列设置为自然标识符(将其移动到根实体父级+在那里添加注释),但没有任何区别-相同的错误
想法