Dropwizard Hibernate 无法定位持久性错误
Dropwizard Hibernate Unable to locate persister Error
我已经建立了一个 Dropwizard 项目和我的第一个棒球统计数据端点 api。有效的 table 和 class 名称是 rangerstats_player / Player。我尝试对 table 做同样的事情 我已经调用 rangerstats_hitter_season_stats 但是我 运行 在尝试做一个简单的 GET 时进入下面的错误并且还没有弄清楚如何修复它或什么问题是
org.hibernate.UnknownEntityTypeException: Unable to locate persister: core.HitterSeasonStats
下面是两者的代码 classes/tables 以显示相似之处,因为我认为模式完全相同,我不知道哪里出了问题。
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);
}
}
Player.java
@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;
}
......
}
PlayerDAO.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 的方式。我已经将它们放在一起形成教程并从中获取了语法。我看到我只在我的包中使用播放器 class。我需要找到一种在主应用程序 class.
中连接数据库的新方法
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));
}
我尝试创建另一个捆绑包并添加另一个捆绑包 class 但看起来我们只能有一个捆绑包
java.lang.IllegalArgumentException: A metric named io.dropwizard.db.ManagedPooledDataSource.hibernate.active already exists
编辑:
我需要将 classes 的逗号分隔列表传递给 HibernateBundle 构造函数,问题已解决! :)
为了以后不再出现此类问题,请使用ScanningHibernateBundle
。
ScanningHibernateBundle
将扫描 core
包和所有嵌套的子包,并将所有带有 @Entity
注释的 类 添加到 Hibernate SessionFactory
.
private final HibernateBundle<ApiConfig> hibernatePlayerBundle =
new ScanningHibernateBundle<ApiConfig>("core") {
@Override
public DataSourceFactory getDataSourceFactory(ApiConfig configuration) {
return configuration.getDataSourceFactory();
}
};
最好使用 core.model
包名称代替 core
。
我已经建立了一个 Dropwizard 项目和我的第一个棒球统计数据端点 api。有效的 table 和 class 名称是 rangerstats_player / Player。我尝试对 table 做同样的事情 我已经调用 rangerstats_hitter_season_stats 但是我 运行 在尝试做一个简单的 GET 时进入下面的错误并且还没有弄清楚如何修复它或什么问题是
org.hibernate.UnknownEntityTypeException: Unable to locate persister: core.HitterSeasonStats
下面是两者的代码 classes/tables 以显示相似之处,因为我认为模式完全相同,我不知道哪里出了问题。
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);
}
}
Player.java
@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;
}
......
}
PlayerDAO.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 的方式。我已经将它们放在一起形成教程并从中获取了语法。我看到我只在我的包中使用播放器 class。我需要找到一种在主应用程序 class.
中连接数据库的新方法 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));
}
我尝试创建另一个捆绑包并添加另一个捆绑包 class 但看起来我们只能有一个捆绑包
java.lang.IllegalArgumentException: A metric named io.dropwizard.db.ManagedPooledDataSource.hibernate.active already exists
编辑:
我需要将 classes 的逗号分隔列表传递给 HibernateBundle 构造函数,问题已解决! :)
为了以后不再出现此类问题,请使用ScanningHibernateBundle
。
ScanningHibernateBundle
将扫描 core
包和所有嵌套的子包,并将所有带有 @Entity
注释的 类 添加到 Hibernate SessionFactory
.
private final HibernateBundle<ApiConfig> hibernatePlayerBundle =
new ScanningHibernateBundle<ApiConfig>("core") {
@Override
public DataSourceFactory getDataSourceFactory(ApiConfig configuration) {
return configuration.getDataSourceFactory();
}
};
最好使用 core.model
包名称代替 core
。