java - 为什么hibernate连接所有表,声明这个特定的连接?

标签 java hibernate

我正在使用hibernate-core:3.3.1.GA

我有三个映射:

PlayerAccount:

@Entity
@Table(name = "player_account")
public class PlayerAccount {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @ManyToOne(targetEntity = Player.class, fetch = FetchType.EAGER)
    @JoinColumn(name="player_id")
    private Player player;

    //GET, SET
}

PlayerAchievements:

@Entity
@Table(name="player_achievement")
public class PlayerAchievement {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @ManyToOne(targetEntity = Player.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "player_id")
    private Player player;

    //GET, SET
}

和类Player

@Entity
@Table(name = "player")
@Inheritance(strategy = InheritanceType.JOINED)
public class Player {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "ps_id")
    private String psId;

    @Column(name = "login")
    private String login;

    @Column(name = "password")
    private String password;

    @Column(name = "email")
    private String email;

    //GET, SET
}

问题: 当我尝试编写如下简单的条件查询时:

Criteria criteria = getSession().createCriteria(PlayerAccount.class);
criteria.add(Restrictions.eq("playerId", playerId));
criteria.list();

生成的 sql 查询包含连接,具有以下 View :

SELECT
-- columns to select
FROM player_account this_ 
LEFT OUTER JOIN player player2_ 
ON this_.player_id=player2_.id 
LEFT OUTER JOIN external_partner_player player2_1_ 
ON player2_.id=player2_1_.player_id
LEFT OUTER JOIN player_achievement achievemen3_ 
ON player2_.id=achievemen3_.player_id 
WHERE player_id = 2362189

问题是,player_achievements 可能包含多个具有相同 player_id 值的行。因为我们在该条件查询中可能有重复的结果。如何使用 hibernate 解决这个问题而不编写 sql 查询?

最佳答案

因为获取类型是急切的。这意味着您始终希望在加载主实体时加载实体。 您可以使用 FetchType.LAZY 以获得最佳性能。这里解释得更好:https://howtoprogramwithjava.com/hibernate-eager-vs-lazy-fetch-type/

关于java - 为什么hibernate连接所有表,声明这个特定的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26676899/

相关文章:

java - JFreechart 刻度单位

java - Hibernate Session 在 native sql 查询之前没有被刷新

java - 是什么导致hibernate生成update子句?

java - Akka 。我应该以参与者的身份实现所有服务/DAO 吗?

java - Java 7 的内部字符编码

java - 具有延迟初始化的随机数数组

javax.persistence.Persistence.getPersistenceUtil()Ljavax/persistence/PersistenceUtil

java - Hibernate select id of join column without join

java - 使用多个外键作为复合主键的一对多实体映射

java - 了解快速排序语法