2

This is my POJO, a simple student class.

@Proxy(lazy = false)
@Entity(name = "Students")
public class Student implements Serializable {

    private static final long serialVersionUID = -9182600037012718128L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column
    private String name;

    private List<Homework> homework; // <-- the problematic line

    public Student(){
    }

    public getId(){return id;}
    public setId(long id){this.id = id;}

    public getName(){return name;}
    public setName(String name){this.name = name;}

    public getHomework(){return homework;}
    public setHomework(List<Homework> homework){this.homework = homework;}
}

Unfortunately, even though the homework field is not annotated (since I currently do not want to map it to my DB), I get this exception when running my application:

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: Students, for columns: [org.hibernate.mapping.Column(homework)]

This is my hibernate-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
    <property name="username" value="root" />
    <property name="password" value="root" />
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/test" />
    <property name="testOnBorrow" value="true" />
    <property name="validationQuery" value="select 1" />
</bean>

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
            hibernate.hbm2ddl.auto=update
            hibernate.show.sql=true
        </value>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.test.entity.Student</value>
        </list>
    </property>
</bean>

Any help is appreciated! Thanks!

1 Answer 1

5

You can make non mapped field as transient, to make hibernate not try to map it with DB

private transient List<Homework> homework; 

or you can annotate it with @javax.persistence.Transient annotation

@Transient
private List<Homework> homework; 

One feature of hibernate is, it tries to map all the fields of Entity class with the corresponding columns of the table. So for the variable homework, it searches for the corresponding column with the same name "homework" (case -insensitive) in the mapped table.

See the documentation here, and it says

Every non static non transient property (field or method depending on the access type) of an entity is considered persistent, unless you annotate it as @Transient. Not having an annotation for your property is equivalent to the appropriate @Basic annotation.

Sign up to request clarification or add additional context in comments.

1 Comment

thanks for the fast response... but why is it mapped anyway?? Shouldn't Hibernate map only annotated fields?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.