Java 如何使用persistence.xml创建EntityManagerFactory的实例?
我正在使用Spring、Hibernate和JPA创建一个后端应用程序。 目前应用程序测试通过,但我收到一条警告: 警告:HH000436:实体管理器工厂名称(JpaPersistenceUnit)已注册 我认为这样做的原因是我在persistence.xml中定义了我的JpaPersistenceUnit,并且在dao类中创建了一个。如果是这种情况,我需要找到一种方法,从persistence.xml获取我的JpaPersistenceUnit,而无需(再次)创建它。但我不知道怎么 这是我的persistence.xml:Java 如何使用persistence.xml创建EntityManagerFactory的实例?,java,spring,hibernate,jpa,intellij-idea,Java,Spring,Hibernate,Jpa,Intellij Idea,我正在使用Spring、Hibernate和JPA创建一个后端应用程序。 目前应用程序测试通过,但我收到一条警告: 警告:HH000436:实体管理器工厂名称(JpaPersistenceUnit)已注册 我认为这样做的原因是我在persistence.xml中定义了我的JpaPersistenceUnit,并且在dao类中创建了一个。如果是这种情况,我需要找到一种方法,从persistence.xml获取我的JpaPersistenceUnit,而无需(再次)创建它。但我不知道怎么 这是我的p
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="JpaPersistenceUnit"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.password" value="groepD"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/groepd"/>
<property name="hibernate.connection.username" value="groepD"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
这是实体:
@Entity
@Table(name = "T_TRIP")
public class Trip {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotNull
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="T_TRIP_ADMINS",
joinColumns={@JoinColumn(name="tripId")},
inverseJoinColumns={@JoinColumn(name="userId")})
private Set<User> admins;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="T_TRIP_PARTICIPANT",
joinColumns={@JoinColumn(name="tripId")},
inverseJoinColumns={@JoinColumn(name="userId")})
private Set<User> invitedUsers;
@NotNull
private Boolean privateTrip;
@NotNull
private Boolean published;
@Enumerated(EnumType.STRING)
private TripType type;
@NotNull
private Integer nrDays;
@NotNull
private Integer nrHours;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "tripId")
private Set<Stop> stops;
public Trip(){
initLists();
}
private void initLists(){
this.admins = new HashSet<User>();
this.invitedUsers = new HashSet<User>();
this.stops = new HashSet<Stop>();
}
public void addStop(Stop stop) {
stops.add(stop);
}
public boolean removeStop(Stop stop) {
if (stops.size() > 1 && stops.contains(stop)) {
stops.remove(stop);
return true;
} else {
return false;
}
}
...More getters and setters...
}
@实体
@表(name=“T_行程”)
公务舱旅行{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
@NotNull
私有字符串名称;
@多个(级联=级联类型.ALL)
@JoinTable(name=“T\u TRIP\u ADMINS”,
joinColumns={@JoinColumn(name=“tripId”)},
inverseJoinColumns={@JoinColumn(name=“userId”)}
私有集管理员;
@多个(级联=级联类型.ALL)
@JoinTable(name=“旅行参与者”,
joinColumns={@JoinColumn(name=“tripId”)},
inverseJoinColumns={@JoinColumn(name=“userId”)}
私人设置邀请者;
@NotNull
私人旅行;
@NotNull
私有布尔出版;
@枚举(EnumType.STRING)
私有TripType;
@NotNull
私人整数日;
@NotNull
私人整数小时;
@OneToMany(级联=级联类型.ALL)
@JoinColumn(name=“tripId”)
私人设站;
公共旅行(){
initLists();
}
私有void initlist(){
this.admins=new HashSet();
this.invitedUsers=new HashSet();
this.stops=new HashSet();
}
公共无效添加停止(停止停止){
停止。添加(停止);
}
公共布尔removeStop(停止){
if(stops.size()>1&&stops.contains(stop)){
停止。移除(停止);
返回true;
}否则{
返回false;
}
}
…更多的能手和二传手。。。
}
如果有人能告诉我如何修复该警告,那将非常有帮助。首先:(在applicationContext.xml中)
下一步:(更新您的代码)
remove:EntityManagerFactory emf=Persistence.createEntityManagerFactory(“JpaPersistenceUnit”)
下一步:您可以通过以下方式获得类EntityManager
@持久上下文
受保护的实体管理器实体管理器
ps:对不起,我的英语这么差,
祝你一切顺利 可能重复。这不是完全相同的问题,但有帮助:)我在applicationcontext和持久性XML文件中定义了实体管理器工厂。。。删除了applicationContext中的一个,解决了问题!谢谢
public interface TripDao extends GenericDao<Trip,Integer> {
}
@Repository
public class TripDaoImpl implements TripDao {
protected EntityManager entityManager;
public TripDaoImpl() {
entityManager = emf.createEntityManager();
}
@Override
@Transactional
public void add(Trip entity) {
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.getTransaction().commit();
}
....
}
@Entity
@Table(name = "T_TRIP")
public class Trip {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotNull
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="T_TRIP_ADMINS",
joinColumns={@JoinColumn(name="tripId")},
inverseJoinColumns={@JoinColumn(name="userId")})
private Set<User> admins;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="T_TRIP_PARTICIPANT",
joinColumns={@JoinColumn(name="tripId")},
inverseJoinColumns={@JoinColumn(name="userId")})
private Set<User> invitedUsers;
@NotNull
private Boolean privateTrip;
@NotNull
private Boolean published;
@Enumerated(EnumType.STRING)
private TripType type;
@NotNull
private Integer nrDays;
@NotNull
private Integer nrHours;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "tripId")
private Set<Stop> stops;
public Trip(){
initLists();
}
private void initLists(){
this.admins = new HashSet<User>();
this.invitedUsers = new HashSet<User>();
this.stops = new HashSet<Stop>();
}
public void addStop(Stop stop) {
stops.add(stop);
}
public boolean removeStop(Stop stop) {
if (stops.size() > 1 && stops.contains(stop)) {
stops.remove(stop);
return true;
} else {
return false;
}
}
...More getters and setters...
}
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation"
value="classpath:persistence.xml">
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
</bean>
</property>
<property name="loadTimeWeaver"> <!-- 运行时植入 -->
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
</bean>