首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >eclipselink批取入在多个租户中不能正常工作。

eclipselink批取入在多个租户中不能正常工作。
EN

Stack Overflow用户
提问于 2016-06-16 02:47:37
回答 1查看 260关注 0票数 2

我使用@Multitenant(SINGLE_TABLE)来支持多租户。为了解决n+1问题,我使用了eclipselink的批取特性。

代码语言:javascript
复制
@Entity
public class TestEntity implements Serializable {
    @Id
    @Column
    private Long id;

    @OneToMany(mappedBy = "testEntity", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @BatchFetch(BatchFetchType.IN)
    private List<TestEntityLine> lines = new ArrayList<>();
}

@Entity
public class TestEntityLine implements Serializable {
    @Id
    @Column
    private Long id;

    @JoinColumn(name = "PID", referencedColumnName = "ID", nullable = true)
    private TestEntity testEntity;
}

当我使用以下方法查询时:

代码语言:javascript
复制
   String boql = "SELECT e FROM TestEntity e order by e.id";
   query.setFirstResult(1); // for pagination
   query.setMaxResults(3); // for pagination

sql和结果日志:

代码语言:javascript
复制
2016-06-16 10:05:14.558 [main] DEBUG o.e.p.s./.sql - SELECT ID AS a1 FROM TESTENTITY ORDER BY ID LIMIT ? OFFSET ?
    bind => [3, 1]
entity-2
2016-06-16 10:05:14.594 [main] DEBUG o.e.p.s./.sql - SELECT ID, NAME, VALUE, PID FROM TESTENTITYLINE WHERE (PID IN (?,?,?))
    bind => [2, 3, 4]
entityLine-2-3
entityLine-2-1
entityLine-2-2
entity-3
entityLine-3-2
entityLine-3-1
entityLine-3-3
entity-4
entityLine-4-3
entityLine-4-2
entityLine-4-1

所有这些都是完美的。但当我启用多租户时:

代码语言:javascript
复制
@Entity
public class TestMultiTenantEntity implements Serializable {
    @Id
    @Column
    private Long id;

    @OneToMany(mappedBy = "testEntity", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @BatchFetch(BatchFetchType.IN)
    private List<TestMultiTenantEntityLine> lines = new ArrayList<>();
}

@Entity
public class TestMultiTenantEntityLine implements Serializable {
    @Id
    @Column
    private Long id;

    @JoinColumn(name = "PID", referencedColumnName = "ID", nullable = true)
    private TestMultiTenantEntity testEntity;
}

@MappedSuperclass
@Multitenant(SINGLE_TABLE)
@TenantDiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER, primaryKey = true, name = MultiTenantSupport.TENANT_COLUMN_NAME, length = 12, contextProperty = MultiTenantSupport.MULTITENANT_CONTEXT_PROPERTY)
public abstract class MultiTenantSupport {

    public static final String MULTITENANT_CONTEXT_PROPERTY = "tenant_id";

    public static final String TENANT_COLUMN_NAME = "TENANT_ID";

}

当我使用以下方法查询时:

字符串boql =“从TestEntity e order by e.id选择e”;query.setFirstResult(1);//表示分页query.setMaxResults(3);//表示分页

sql和结果日志:

代码语言:javascript
复制
2016-06-16 10:17:17.123 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID AS a1, ID AS a2 FROM TESTMULTITENANTENTITY WHERE (TENANT_ID = ?) ORDER BY ID LIMIT ? OFFSET ?
    bind => [1, 3, 1]
entity-2
2016-06-16 10:17:17.159 [main] DEBUG o.e.p.s./.sql - SELECT t0.TENANT_ID, t0.ID, t0.NAME, t0.VALUE, t0.PID FROM TESTMULTITENANTENTITYLINE t0, TESTMULTITENANTENTITYLINE t1 WHERE ((((t1.TENANT_ID, t1.PID) IN ((?,?),(?,?),(?,?))) AND (t0.TENANT_ID = ?)) AND (t1.TENANT_ID = ?))
    bind => [1, 2, 1, 3, 1, 4, 1, 1]  **?????? Why TESTMULTITENANTENTITYLINE joins to itself t0/t1? This produce many duplicated records**
2016-06-16 10:17:17.227 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID, ID FROM TESTMULTITENANTENTITY WHERE (((TENANT_ID = ?) AND (ID = ?)) AND (TENANT_ID = ?))
    bind => [1, 1, 1] **?????? I try to fetch record 2,3,4, why it fetch out 1, 5, 6?**
2016-06-16 10:17:17.267 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID, ID FROM TESTMULTITENANTENTITY WHERE (((TENANT_ID = ?) AND (ID = ?)) AND (TENANT_ID = ?))
    bind => [1, 5, 1]
2016-06-16 10:17:17.295 [main] DEBUG o.e.p.s./.sql - SELECT TENANT_ID, ID FROM TESTMULTITENANTENTITY WHERE (((TENANT_ID = ?) AND (ID = ?)) AND (TENANT_ID = ?))
    bind => [1, 6, 1]
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-1
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-2
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entityLine-2-3
entity-3
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-1
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-2
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entityLine-3-3
entity-4
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-1
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-2
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3
entityLine-4-3

为什么TESTMULTITENANTENTITYLINE连接到它自己t0/t1?这会产生许多重复的记录

我试图获取记录2,3,4,为什么要提取1,5,6?

你能帮忙吗?这是个虫子吗?还是我漏掉了什么?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-22 09:51:41

通过以下设置从主键中删除tenant_id之后,它就可以工作了:

代码语言:javascript
复制
@TenantDiscriminatorColumn(primaryKey = false, ...)

但是,尽管我不需要它们,但“加入和存在”选项仍然不起作用。在联接和存在sql中,所需的pids似乎不包含在where条件中。这就是为什么它加载所有其他不需要的条目

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37849075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档