Spring 数据 JPA - 实体名称无效标识符

Spring Data JPA - entity name invalid identifier

我正在实现一个简单的 CRUD 控制器,但我在使用 JPA/Hibernate 和 Spring Data JPA 框架时遇到了一些问题。存储库似乎工作正常,除非我使用映射到名称包含下划线的 table 的实体。

ProfileItem.java

@Entity
@Table(name = "PROFILE_ITEM")
@SequenceGenerator(name = "SequenceGenerator", sequenceName = "SEQ_PROFILE_ITEM", initialValue = 1, allocationSize = 1)
public class ProfileItem implements Serializable {

    private static final long serialVersionUID = ApplicationConst.DEFAULT_SERIAL_VERSION_UID;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceGenerator")
    private Long id;

    @Column(name = "USER_ID")
    private String uid;

    private String context;

    private String application;

    @Column(name = "CREATED_ON")
    @Temporal(value = TemporalType.DATE)
    private Date createdOn;

    @Column(name = "MODIFIED_ON")
    @Temporal(value = TemporalType.DATE)
    private Date modifiedOn;

    private Long version;

    @OneToMany(mappedBy = "profile", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<ProfileItemData> profileItemData;

    // getters and setters ...
}

ProfileItemDao.java

public interface ProfileItemDao extends Repository<ProfileItem, Long> {

    public ProfileItem findById(Long id);

}

当我尝试调用接口方法时出现以下异常:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "PROFILEITE0_"."USER_ID": invalid identifier

正在使用

@Query("SELECT p FROM ProfileItem p WHERE p.id = :id")
public ProfileItem findById(@Param("id") Long id);

也没有帮助。

我用一个单词名称重新创建了 table 的场景,一切正常。似乎 Spring 试图强制执行某种命名策略。

有什么办法放弃吗?我找到的每个解决方案都与我不使用的 Spring 引导有关。

提前谢谢你。如有必要,我可以提供一些额外的信息。

我昨天找到了答案。看来你们一直都是对的。我添加了以下行以查看实际的休眠 SQL 查询

persistence.xml

<persistence-unit name="BPM" transaction-type="${persistence-unit.transaction-type}">
    <!-- snip -->
    <properties>
        <!-- snip -->
        <property name="hibernate.show_sql" value="true" />
        <!-- snip -->
    </properties>
</persistence-unit>

repositoryContext.xml(类路径上的配置文件之一)

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- snip -->
        <property name="jpaProperties">
            <props>
                <!-- snip -->
                <prop key="hibernate.show_sql">true</prop>
                <!-- snip -->
            </props>
        </property>
    </bean>

当我查看日志时,我意识到 hibernate 在获取相关实体列表时对 PROFILE_ITEMPROFILE_ITEM_DATA 查询使用相同的别名 PROFILEITE0_。所以我检查了 PROFILE_ITEM_DATA 的实体和数据库架构,发现数据库中的其中一列的名称和实体中的名称不匹配,就像你们说的那样。

在数据库中,列名曾经是USER_ID。然后我把它重命名为 ID_PROFILE_DATA 但忘记反映实体中的变化。

感谢您的宝贵时间和回复。他们告诉我正确的方法。