有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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);

也没有帮助

我已经为一个只有一个单词名的表重新创建了场景,一切正常。似乎Spring正试图强制一些命名策略

有没有办法放弃它?我找到的每一个解决方案都与我不使用的Spring Boot有关

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


共 (1) 个答案

  1. # 1 楼答案

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

    坚持。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,但忘了反映实体中的更改

    感谢您的时间和回复。他们给我指明了正确的道路