Java 如何使用persistence.xml创建EntityManagerFactory的实例?

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

我正在使用Spring、Hibernate和JPA创建一个后端应用程序。 目前应用程序测试通过,但我收到一条警告: 警告:HH000436:实体管理器工厂名称(JpaPersistenceUnit)已注册

我认为这样做的原因是我在persistence.xml中定义了我的JpaPersistenceUnit,并且在dao类中创建了一个。如果是这种情况,我需要找到一种方法,从persistence.xml获取我的JpaPersistenceUnit,而无需(再次)创建它。但我不知道怎么

这是我的persistence.xml:

<?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>