java.lang.NoClassDefFoundError : org/hibernate/service/ServiceRegistry after building by Maven

标签 java mysql hibernate maven javafx

我正在使用 Maven 构建一个应用程序。我在本地MySql中有一个数据库,当它仍在Eclipse环境中时,一切似乎都正常。应用程序和数据库之间的连接功能齐全,无需担心。 在 Maven 中,我设置了目标“package”,到目前为止没有出现任何问题,但是当应用程序想要进行 SELECT ALL 查询时,它会遇到以下错误:

Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: org/hibernate/service/ServiceRegistry
    at festival.AbstractFestivalDAOimpl.open(AbstractFestivalDAOimpl.java:28)
    at festival.FestivalsPane.FestivalDAOImpl.selectAllFestivals(FestivalDAOImpl.java:51)
    at festival.FestivalsPane.FestivalTable.getdata(FestivalTable.java:234)
    at festival.FestivalsPane.FestivalTable.<init>(FestivalTable.java:71)
    at festival.ArtFestivals$1.handle(ArtFestivals.java:148)
    at festival.ArtFestivals$1.handle(ArtFestivals.java:143)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.ClassNotFoundException: org.hibernate.service.ServiceRegistry
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 53 more

这是我的 POM.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Festival</groupId>
<artifactId>Festival</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
  <dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
  </dependency>
  <dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.4.3</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-tools</artifactId>
    <version>4.3.1.CR1</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.1.Final</version>
</dependency>   
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.18.1-GA</version>
</dependency>
<dependency>
  <groupId>org.jboss.logging</groupId>
  <artifactId>jboss-logging</artifactId>
  <version>3.1.3.GA</version>
</dependency>
<dependency>
  <groupId>org.jboss.spec.javax.transaction</groupId>
  <artifactId>jboss-transaction-api_1.2_spec</artifactId>
  <version>1.0.0.Final</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>barcodes</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>font-asian</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>forms</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>hyph</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>io</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>kernel</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>layout</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>pdfa</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>pdftest</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>sign</artifactId>
  <version>7.0.5</version>
</dependency>
<dependency>
  <groupId>com.squareup.picasso</groupId>
  <artifactId>picasso</artifactId>
  <version>2.5.2</version>
</dependency>
<dependency>
  <groupId>org.xerial</groupId>
  <artifactId>sqlite-jdbc</artifactId>
  <version>3.15.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.5</version>
</dependency>


</dependencies>
   <build>
     <sourceDirectory>src</sourceDirectory>
     <resources>
       <resource>
         <directory>src</directory>
         <excludes>
           <exclude>**/*.java</exclude>
         </excludes>
       </resource>
     </resources>
     <plugins>
     <plugin>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>3.5.1</version>
       <configuration>
         <source>1.8</source>
         <target>1.8</target>
       </configuration>
     </plugin>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>festival.ArtFestivals</mainClass>    
                </manifest>
            </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

最后这是我的代码:

public class AbstractFestivalDAOimpl implements FestivalDAO{

    Session session;
    Transaction transaction;

    @Override
    public void open() {
        session = HibernateSessionFact.getSessionFactory().openSession();
        transaction= session.getTransaction();
    }

    @Override
    public void commit(){
         if(!transaction.wasCommitted()){

            transaction = session.beginTransaction();
            transaction.commit();
        }
    }


    @Override
    public void close() {

        session.close();
    }

    @Override
    public void addFestival(CinemaFestival cinemafestival) {
        session.save(cinemafestival);
    }

    @Override
    public void deleteFestival(CinemaFestival cinemafestival) {
        session.delete(cinemafestival);
    }

    @Override
    public void updateFestival(CinemaFestival cinemafestival) {
        session.update(cinemafestival);
    }

    @Override
    public ObservableList<CinemaFestival> selectAllFestivals(){
        String selall = "from festival.CinemaFestival";
        Query query = session.createQuery(selall);
        ObservableList<CinemaFestival> festlist = FXCollections.observableArrayList();
        List<CinemaFestival> list = query.list();
        for(Object o : list){
            CinemaFestival c = (CinemaFestival) o;
            festlist.add(c);
        }
        close();
        return festlist;
    }

    @Override
    public ObservableList<CinemaFestival> instantSearchFestivals(String key){
        String[] stringdata = {"fullname", "abbr" , "Country" , "City" ,
            "Website"};
        ObservableList<CinemaFestival> festlist = FXCollections.observableArrayList();

        for (String s: stringdata){
            String selwhe = "from festival.CinemaFestival where " + s + " like :key";

            Query query = session.createQuery(selwhe);
            query.setParameter("key", "%" +key + "%");

            List<CinemaFestival> list = query.list();
            for(Object o : list){
            CinemaFestival c = (CinemaFestival) o;
            if (!festlist.contains(c)){
            festlist.add(c);
            }
        }
        }
        return festlist;
    }

    @Override
    public ObservableList<CinemaFestival> advancedSearchFestivals(String s , HashMap <String,Object> map){

        ObservableList<CinemaFestival> resultlist = FXCollections.observableArrayList();

        Query query = session.createQuery(s);
        for (String key: map.keySet()){
            if (map.get(key) instanceof String){
            query.setParameter(key, "%" + map.get(key) + "%");
            }
            if (map.get(key) instanceof Boolean){
                query.setParameter(key, map.get(key));
            }
            if (map.get(key) instanceof Integer){
                query.setParameter(key, map.get(key));
            }
        }
            List list = query.list();
            for(Object o : list){
            CinemaFestival c = (CinemaFestival) o;
            if (!resultlist.contains(c)){
            resultlist.add(c);
            }
        }

        return resultlist;
    }

    @Override
    public void addClient(Client client) {
        session.save(client);
    }

    @Override
    public void deleteClient(Client client) {
        session.delete(client);
    }

    @Override
    public void updateClient(Client client) {
        session.update(client);
    }

    @Override
    public ObservableList<Client> selectAllClients(){
        String selall = "from festival.Client";
        Query query = session.createQuery(selall);
        ObservableList<Client> clientlist = FXCollections.observableArrayList();
        List<Client> list = query.list();
        for(Object o : list){
            Client c = (Client) o;
            clientlist.add(c);
        }
        close();
        return clientlist;
    }

    @Override
    public ObservableList<Client> instantSearchClients(String key){
        String[] stringdata = {"firstname", "surname" , "job1" , "job2" ,
            "mobile1" , "mobile2" , "home1" , "home2" , "work1" , "work2" , "other1" , "other2" };
        ObservableList<Client> clientlist = FXCollections.observableArrayList();

        for (String s: stringdata){
            String selwhe = "from festival.Client where " + s + " like :key";

            Query query = session.createQuery(selwhe);
            query.setParameter("key", "%" +key + "%");

            List<Client> list = query.list();
            for(Object o : list){
            Client c = (Client) o;
            if (!clientlist.contains(c)){
            clientlist.add(c);
            }
        }
        }
        return clientlist;
    }

    @Override
    public void addMovie(Movie movie) {
        session.save(movie);
    }

    @Override
    public void deleteMovie(Movie movie) {
        session.delete(movie);
    }

    @Override
    public void updateMovie(Movie movie) {
        session.update(movie);
    }

    @Override
    public ObservableList<Movie> selectAllMovies(){
        String selall = "from festival.Movie";
        Query query = session.createQuery(selall);
        ObservableList<Movie> movielist = FXCollections.observableArrayList();
        List<Movie> list = query.list();
        for(Object o : list){
            Movie c = (Movie) o;
            movielist.add(c);
        }
        close();
        return movielist;
    }

    @Override
    public ObservableList<Movie> instantSearchMovies(String key){
        String[] stringdata = {"fullname", "language" , "section" , "genre"};
        ObservableList<Movie> movielist = FXCollections.observableArrayList();

        for (String s: stringdata){
            String selwhe = "from festival.Movie where " + s + " like :key";

            Query query = session.createQuery(selwhe);
            query.setParameter("key", "%" +key + "%");

            List<Movie> list = query.list();
            for(Object o : list){
            Movie c = (Movie) o;
            if (!movielist.contains(c)){
            movielist.add(c);
            }
        }
        }
        return movielist;
    }

    @Override
    public void addSubmit(Submitionrecord submit) {
        session.save(submit);
    }

    @Override
    public void deleteSubmit(Submitionrecord submit) {
        session.delete(submit);
    }

    @Override
    public void updateSubmit(Submitionrecord submit) {
        session.update(submit);
    }

    @Override
    public ObservableList<Submitionrecord> selectAllSubmits(){
        String selall = "from festival.Submitionrecord";
        Query query = session.createQuery(selall);
        ObservableList<Submitionrecord> submitlist = FXCollections.observableArrayList();
        List<Submitionrecord> list = query.list();
        for(Object o : list){
            Submitionrecord s = (Submitionrecord) o;
            submitlist.add(s);
        }
        close();
        return submitlist;
    }

    @Override
    public ObservableList<Submitionrecord> instantSearchSubmits(String key){
        String[] stringdata = {"fullname", "language" , "section" , "genre" , "duration"};
        ObservableList<Submitionrecord> submitlist = FXCollections.observableArrayList();

        for (String s: stringdata){
            String selwhe = "from festival.Submitionrecord where " + s + " like :key";

            Query query = session.createQuery(selwhe);
            query.setParameter("key", "%" +key + "%");

            List<Submitionrecord> list = query.list();
            for(Object o : list){
                Submitionrecord s1 = (Submitionrecord) o;
            if (!submitlist.contains(s1)){
            submitlist.add(s1);
            }
        }
        }
        return submitlist;
    }
}

第 28 行是:

session = HibernateSessionFact.getSessionFactory().openSession();

这是 mvn dependency:tree 结果

[INFO] +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] +- net.sf.ehcache:ehcache-core:jar:2.4.3:compile
[INFO] +- org.hibernate:hibernate-tools:jar:4.3.1.CR1:compile
[INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.4.Final:compile
[INFO] |  +- org.hibernate:hibernate-entitymanager:jar:4.3.1.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.1:compile
[INFO] |  |  +- logkit:logkit:jar:1.0.1:compile
[INFO] |  |  +- avalon-framework:avalon-framework:jar:4.1.3:compile
[INFO] |  |  \- javax.servlet:servlet-api:jar:2.3:compile
[INFO] |  +- ant:ant:jar:1.6.5:compile
[INFO] |  +- freemarker:freemarker:jar:2.3.8:compile
[INFO] |  +- org.hibernate:jtidy:jar:r8-20060801:compile
[INFO] |  +- org.eclipse.tycho:org.eclipse.jdt.core:jar:3.9.1.v20130905-0837:compile
[INFO] |  +- org.eclipse:text:jar:3.3.0-v20070606-0010:compile
[INFO] |  |  \- org.eclipse.core:commands:jar:3.3.0-I20070605-0010:compile (version selected from constraint [3.2.0,4.0.0))
[INFO] |  +- org.eclipse.core:runtime:jar:3.9.0-v20130326-1255:runtime
[INFO] |  |  +- org.eclipse:osgi:jar:3.10.0-v20140606-1445:runtime (version selected from constraint [3.7.0,4.0.0))
[INFO] |  |  +- org.eclipse.core:jobs:jar:3.6.0-v20140424-0053:runtime (version selected from constraint [3.2.0,4.0.0))
[INFO] |  |  +- org.eclipse.equinox:registry:jar:3.5.400-v20140428-1507:runtime (version selected from constraint [3.4.0,4.0.0))
[INFO] |  |  +- org.eclipse.equinox:preferences:jar:3.5.200-v20140224-1527:runtime (version selected from constraint [3.4.0,4.0.0))
[INFO] |  |  +- org.eclipse.core:contenttype:jar:3.4.200-v20140207-1251:runtime (version selected from constraint [3.3.0,4.0.0))
[INFO] |  |  \- org.eclipse.equinox:app:jar:1.3.200-v20130910-1609:runtime (version selected from constraint [1.0.0,2.0.0))
[INFO] |  +- org.eclipse.equinox:common:jar:3.6.200-v20130402-1505:compile
[INFO] |  \- antlr:antlr:jar:2.7.7:compile
[INFO] +- org.hibernate:hibernate-core:jar:4.3.1.Final:compile
[INFO] |  +- org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  \- org.jboss:jandex:jar:1.1.0.Final:compile
[INFO] +- org.javassist:javassist:jar:3.18.1-GA:compile
[INFO] +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.1:compile
[INFO] |  \- log4j:log4j:jar:1.2.16:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.1:compile
[INFO] +- com.itextpdf:barcodes:jar:7.0.5:compile
[INFO] +- com.itextpdf:font-asian:jar:7.0.5:compile
[INFO] +- com.itextpdf:forms:jar:7.0.5:compile
[INFO] +- com.itextpdf:hyph:jar:7.0.5:compile
[INFO] +- com.itextpdf:io:jar:7.0.5:compile
[INFO] +- com.itextpdf:kernel:jar:7.0.5:compile
[INFO] +- com.itextpdf:layout:jar:7.0.5:compile
[INFO] +- com.itextpdf:pdfa:jar:7.0.5:compile
[INFO] +- com.itextpdf:pdftest:jar:7.0.5:compile
[INFO] |  +- ch.qos.logback:logback-classic:jar:1.1.3:compile
[INFO] |  |  \- ch.qos.logback:logback-core:jar:1.1.3:compile
[INFO] |  \- junit:junit:jar:4.12:compile
[INFO] |     \- org.hamcrest:hamcrest-core:jar:1.3:compile
[INFO] +- com.itextpdf:sign:jar:7.0.5:compile
[INFO] +- com.squareup.picasso:picasso:jar:2.5.2:compile
[INFO] +- org.xerial:sqlite-jdbc:jar:3.15.1:compile
[INFO] \- mysql:mysql-connector-java:jar:5.1.5:compile

有人知道为什么我会收到此异常吗?

最佳答案

终于可以回答我的问题了。问题其实很明显,就是因为经验不足。 在 POM 文件中,我需要向 list 添加一个类路径,我是这样做的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>main.java.festival.ArtFestivals</mainClass>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>lib/</classpathPrefix>
                </manifest>
            </archive>
        </configuration>
  </plugin>

并且成功了。

关于java.lang.NoClassDefFoundError : org/hibernate/service/ServiceRegistry after building by Maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48367304/

相关文章:

java - JMH 基准迭代中的随机峰

java - 创建将在 Web 浏览器中显示的 Java 小程序

java - 如何在 mongoDB 文档字段中保留特殊键并删除其中多余的键?

mysql - 加快 MySQL 重复查询速度

java - Hibernate 检查注解

java - 如何在不卡住 GUI 的情况下调用 SwingWorker .get()?

mysql - 在 ruby​​ 中替换数字后的每个\n

mysql - MAGENTO-SQLSTATE[42S02] : Base table or view not found: 1146 Table '_store.core_resource'

java - 如何停止 @ManyToOne JPA 中的重复对象?

java - hibernate 或 JDBC