我在使用JPA和Hibernate时遇到问题,但无法解决。
因此,这是我的applicationContext.xml:
<context:component-scan base-package="com.abt.fiifootballmanager"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <jdbc:embedded-database type="HSQL" id="dataSource" /> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="emf"> <property name="packagesToScan" value="com.abt.fiifootballmanager.entity" /> <property name="dataSource" ref="dataSource" /> <property name="jpaProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> </props> </property> <property name="persistenceProvider"> <bean class="org.hibernate.jpa.HibernatePersistenceProvider" /> </property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <property name="dataSource" value="dataSource"/> </bean>
这是我的表演实体:
package com.abt.fiifootballmanager.entity; import java.io.Serializable; import javax.persistence.*; import java.math.BigDecimal; import java.util.List; @Entity @Table(name="PERFORMANCES") @NamedQuery(name="Performance.findAll", query="SELECT p FROM Performance p") public class Performance implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId private PerformancePK id; @Column(name="RED_CARD") private BigDecimal redCard; @Column(name="YELLOW_CARD") private BigDecimal yellowCard; @OneToOne(mappedBy="performance") private GoalkeepingPerformance goalkeepingPerformance; @OneToMany(mappedBy="performance") private List<OutfieldPerformance> outfieldPerformances; @ManyToOne @JoinColumn(name="MATCH_ID") private Match match; @ManyToOne @JoinColumn(name="PLAYER_ID") private Player player; ...getters & setters }
这是我的嵌入式id类:
@Embeddable public class PerformancePK implements Serializable { //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; @Column(name="MATCH_ID", insertable=false, updatable=false) private long matchId; @Column(name="PLAYER_ID", insertable=false, updatable=false) private long playerId; ... //getters and setters
所以,这些是我的课程。但是,当我想运行我的应用程序时,会遇到以下异常: 1.Error creating bean with name 'emf' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
1.Error creating bean with name 'emf' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
2. Repeated column in mapping for entity: com.abt.fiifootballmanager.entity.Performance column: MATCH_ID (should be mapped with insert="false" update="false")
我认为第一个例外是由第二个例外引起的。那么,为什么我会得到“实体映射中的重复列?”。使用嵌入式id类是个好主意吗?
你的两个变量match,并player在你的Performance类被映射到相同的列matchId和playerId嵌入式ID。如错误所述,它们“应与insert =“ false” update =“ false”“映射。
match
player
Performance
matchId
playerId
@ManyToOne @JoinColumn(name="MATCH_ID", insertable = false, updatable = false) private Match match; @ManyToOne @JoinColumn(name="PLAYER_ID", insertable = false, updatable = false) private Player player;
这实际上使这些字段为只读,因此MATCH_ID,PLAYER_ID如果嵌入式ID中的值发生更改,Hibernate仅知道更改and 列,而如果matchor 的值发生更改,则Hibernate 不会player更改。
MATCH_ID
PLAYER_ID