代码之家  ›  专栏  ›  技术社区  ›  NewDev

Dropwizard Hibernate无法定位persister错误

  •  2
  • NewDev  · 技术社区  · 7 年前

    我已经为棒球统计api设置了Dropwizard项目和第一个端点。功能表和类名是rangerstats\u player/player。我试着对一个我称为rangerstats\u hitter\u season\u stats的表做同样的操作,但是当我尝试做一个简单的GET时,我遇到了下面的错误,并且没有找到解决方法或问题所在

    org.hibernate.UnknownEntityTypeException: Unable to locate persister: core.HitterSeasonStats
    

    下面是两个类/表的代码,以显示它们的相似性,因为我认为模式完全相同,我不知道会出什么问题。

    HitterSeasonStats。java(注释了一些字段以使其工作,以防出现问题)

    @Entity
    @Table(name = "rangerstats_hitter_season_stats") 
    public class HitterSeasonStats {
        @Id
        private long id;
    //    @Column(name = "player_id")
    //    private long playerId;
        private int g;
        private int pa;
        private int ab;
        //private double avg;
        private int h;
        private int single;
        @Column(name = "double")
        private int doubles;
        private int triple;
        private int hr;
        private int rbi;
        private int bb;
        private int k;
        private int hbp;
        private int sf;
    //    private double slg;
    //    private double obp;
    //    private double ops;
    //    private double war;
        //@Column(name = "season_year")
        //private Date seasonYear;
    
        public long getId() {
            return id;
        }
    }
    

    HitterSeasonStatsDAO。Java语言

    public class HitterSeasonStatsDAO extends AbstractDAO<HitterSeasonStats> {
        public HitterSeasonStatsDAO(SessionFactory factory) {
            super(factory);
        }
    
        public Optional<HitterSeasonStats> findById(Long id) {
            return Optional.fromNullable(get(id));
        }
    
        public List<HitterSeasonStats> findByPlayer(Long playerId) {
            Criteria criteria = criteria().add(Restrictions.eq("playerId", playerId));
            return list(criteria);
        }
    
        public List<HitterSeasonStats> findByPlayerAndYear(Long playerId) {
        Criteria criteria = criteria().add(Restrictions.eq("playerId", playerId));
            return list(criteria);
        }
    }
    

    @Entity
    @Table(name = "rangerstats_player")
    
    @NamedQueries({
        @NamedQuery(name = "core.Player.findAll",
                query = "select p from Player p")
    
    })
    
    public class Player {
        @Id
        private long id;
        @Column(name = "first_name")
        private String firstName;
        @Column(name = "last_name")
        private String lastName;
        private String position;
        private String team;
        private String bat;
        @Column(name = "throw_hand")
        private String throwHand;
        private String height;
        private int age;
        private int weight;
    
        public long getId() {
            return id;
        }
        public String getfirstName() {
            return firstName;
        }
        public String getlastName() {
            return lastName;
        }
        ......
    }
    

    玩家道。Java语言

    public class PlayerDAO extends AbstractDAO<Player> {
    
        public PlayerDAO(SessionFactory factory) {
            super(factory);
        }
    
        public Optional<Player> findById(Long id) {
            return Optional.fromNullable(get(id));
        }
    
        public List<Player> findAll() {
            return list(namedQuery("core.Player.findAll"));
        }
    }
    

    桌子

    rangersstats=# \dt
                         List of relations
     Schema |               Name               | Type  |     Owner     
    --------+----------------------------------+-------+---------------
     public | rangerstats_hitter_game_record   | table | owner
     public | rangerstats_hitter_season_stats  | table | owner
     public | rangerstats_pitcher_game_record  | table | owner
     public | rangerstats_pitcher_season_stats | table | owner
     public | rangerstats_player               | table | owner
    

    编辑:

    我相信我已经找到了导致问题的原因。这就是我注册HibernateBundle的方式。我把这篇文章整理成了教程,并从中提取了语法。我看到我只在包中使用Player类。我需要找到一种新方法来连接主应用程序类中的数据库。

     private final HibernateBundle<ApiConfig> hibernatePlayerBundle =
        new HibernateBundle<ApiConfig>(Player.class) {
        @Override
        public DataSourceFactory getDataSourceFactory(ApiConfig configuration) {
            return configuration.getDataSourceFactory();
        }
    };
    
    @Override
    public void initialize(final Bootstrap<ApiConfig> bootstrap) {
        bootstrap.addBundle(hibernatePlayerBundle);
    }
    
    @Override
    public void run(final ApiConfig configuration, final Environment environment) {
        final PlayerDAO playerDAO = new PlayerDAO(hibernatePlayerBundle.getSessionFactory());
        final HitterSeasonStatsDAO hitterSeasonStatsDAO = new HitterSeasonStatsDAO(hibernateHitterSeasonStatsBundle.getSessionFactory());
        environment.jersey().register(new HitterSeasonStatsResource(hitterSeasonStatsDAO));
        environment.jersey().register(new PlayerResource(playerDAO));
    
    }
    

    我试图用另一个类创建并添加另一个包,但看起来我们只能有一个包

    java.lang.IllegalArgumentException: A metric named io.dropwizard.db.ManagedPooledDataSource.hibernate.active already exists
    

    编辑:

    我需要将逗号分隔的类列表传递给HibernateBundle构造函数,问题解决了!:)

    1 回复  |  直到 7 年前
        1
  •  2
  •   rich    6 年前

    为了避免将来出现此类问题,请使用 ScanningHibernateBundle .

    扫描HibernateBundle 将扫描 core 包和所有嵌套的子包,并使用 @Entity Hibernate注释 SessionFactory

    private final HibernateBundle<ApiConfig> hibernatePlayerBundle =
        new ScanningHibernateBundle<ApiConfig>("core") {
            @Override
            public DataSourceFactory getDataSourceFactory(ApiConfig configuration) {
                return configuration.getDataSourceFactory();
            }
    };
    

    更好地使用 core.model 文件包名称代替 .