我正在实现一个简单的 CRUD Controller ,但我在 JPA/Hibernate 和 Spring Data 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);
}
当我尝试调用接口(interface)方法时,出现以下异常:
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 相关。
提前谢谢您。如果需要的话我可以提供一些额外的信息。
最佳答案
我昨天已经找到答案了。看来你们一直都是对的。我添加了以下行以便查看实际的 Hibernate 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_ITEM
和 PROFILE_ITEM_DATA
查询使用了相同的别名 PROFILEITE0_
的相关实体。因此,我检查了实体和数据库架构中的 PROFILE_ITEM_DATA
并意识到数据库和实体中的其中一列的名称不匹配,就像你们所说的那样。
在数据库中,列的名称曾经是USER_ID
。然后我将其重命名为 ID_PROFILE_DATA
但忘记反射(reflect)实体中的更改。
感谢您的宝贵时间和回复。他们向我展示了正确的方法。
关于java - Spring Data JPA - 实体名称无效标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453547/