java - Hibernate 无法确定列的类型

标签 java hibernate hibernate-mapping

我在 hibernate 中进行简单的一对一映射时遇到问题。 我有两个简单的类(class):

第一个实体:

@Entity
public class GrantingOfLoanData {

    @Id
    @GeneratedValue
    private Long id;

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="loan", referencedColumnName="loan_id")
    public Loan getLoan() {
        return loan;
    }
    private Loan loan;
}

第二个实体:

@Entity
public class Loan {

    @Id
    @GeneratedValue
    @Column(name="loan_id")
    private Long loan_id;

    public Long getLoan_id() {
        return loan_id;
    }
}

当我尝试使用 hibernate 运行此代码时,出现以下异常:

Caused by: org.hibernate.MappingException: Could not determine type for: org.finance.app.core.domain.common.loan.Loan, at table: GrantingOfLoanData, for columns:     [org.hibernate.mapping.Column(loan)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:310) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.mapping.Property.isValid(Property.java:241) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:496) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.mapping.RootClass.validate(RootClass.java:270) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.Configuration.validate(Configuration.java:1358) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) ~[hibernate-entitymanager-4.3.5.Final.jar:4.3.5.Final]

我正在使用 Spring 版本 4.0.5 并尝试减少 xml,因此据我所知,LocalContainerEntityManagerFactoryBean 现在支持“packagesToScan”属性,可以在其中指定要扫描 @Entity 类的包。

我的@Configuration JPA 类如下所示:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-pgsql.properties" })
@ComponentScan({ "org.finance.app" })
public class PersistenceJPAConfig {

@Autowired
private Environment env;

public PersistenceJPAConfig() {
    super();
}

// beans

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
    final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[] { "org.finance.app" });

    final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(additionalProperties());

    return em;
}

@Bean
public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
    dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
    dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
    dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));

    return dataSource;
}

@Bean
public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

final Properties additionalProperties() {
    final Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
    hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
    return hibernateProperties;
   }
}

最佳答案

Hibernate 不允许您将注释与字段/getter 混合搭配。

如果您的 @Id 注释是在 field 上设置的,则所有映射都应遵循 fields

尝试将您的@OneToOne移动到field而不是像下面这样的setter

 @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="loan", referencedColumnName="loan_id")
    private Loan loan;

 public Loan getLoan() {
        return loan;
    }

关于java - Hibernate 无法确定列的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108442/

相关文章:

java - 从 angularjs 对 java 的向上调用仅在手动页面刷新后才起作用

java - 在java中可靠地卸载dll

java - 如何使用java邮件API在邮件中发送多个信息

java - 带有继承的 JPA ManyToOne 映射

java - 如何在 Hibernate 中更新集合?

java - 非空属性引用持久值的空值或 transient 值

hibernate - 你如何检索嵌套的集合?

java - 如何通过重用 cfg.xml 和 util 类连接多个数据库?

java - 具有相同名称的通用和非通用

java - Spring,Hibernate,Blob 延迟加载