我最近重构了我们的数据库模式,使每个表中的id列格式为" tableName" + ID,IE" SettingsID"而不只是" id"所有表格。现在,当我尝试从其中一个表中获取任何内容时,我的spring-data后端正在崩溃。它抱怨说有一个"无效的列名称' id'"。我假设我需要做的是将我的ID列的新名称映射到spring数据想要成为id列,但到目前为止我还没有成功。
我认为唯一需要的配置会在我的实体对象中发生。这是我的Settings.java实体对象类:
@Entity
@Table(name = Settings.TABLE_NAME)
public class Settings extends AbstractPersistable<Long> {
public static final String TABLE_NAME = "SETTINGS";
@AttributeOverride(name = "id", column = @Column(name="settingsID"))
private long settingsID;
@Column(name = "CUSTOMERID")
private String customerID;
@Column(name = "MERCHANTID")
private String merchantID;
...
....
}
以防万一重要,(我不认为这样做)这是我抛出此错误时调用的函数:
@Repository
public interface SettingsDAO extends CrudRepository<Settings, Long> {
/**
* Finds the entry in the Settings table for a given customerID
* @param customerID The customerID to search for
* @return The settings object for the given customer ID
*/
Settings findOneByCustomerID(String customerID);
}
我得到的错误(除了通用的hibernate错误,说它无法提取结果集)是
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'id'.
答案 0 :(得分:1)
在签出this帖后,我意识到我不应该在字段上添加@AttributeOverride注释,而是在类本身。这样,spring数据不会尝试双重映射id字段。我的新实体对象如下所示:
@Entity
@Table(name = Settings.TABLE_NAME)
@AttributeOverride(name="id", column=@Column(name="SETTINGSID"))
public class Settings extends AbstractPersistable<Long> {
public static final String TABLE_NAME = "SETTINGS";
@Column(name = "CUSTOMERID")
private String customerID;
@Column(name = "MERCHANTID")
private String merchantID;
...
请注意,现在没有id字段。
答案 1 :(得分:1)
将此名称/值对添加到application.properties对我有用,而无需使用AttributeOverride注释
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy