Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate不通过主键连接_Java_Hibernate_Hibernate Mapping_One To One - Fatal编程技术网

Java Hibernate不通过主键连接

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 @

(我知道这不是第一次被问到这个问题,但我尝试了所有建议的解决方案,但没有效果。)

因此,我有一个父实体和一个具有OneToOne映射的子实体-问题是连接不是(也不应该)由主键列完成,而是由其他id列(可为空的自然id)完成

我在这里有4个相关实体:

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列设置为自然标识符(将其移动到根实体父级+在那里添加注释),但没有任何区别-相同的错误

想法