首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring Data JPA Hibernate -出现在@ManyToOne关系中的额外元素

Spring Data JPA Hibernate -出现在@ManyToOne关系中的额外元素
EN

Stack Overflow用户
提问于 2017-03-15 23:09:52
回答 1查看 65关注 0票数 0

我有一些实体类,它们具有一对多多对一的关系。我使用的是Spring和Hibernate。

在我的应用程序中,每个TwoWayService恰好有2个Service

摘录:

代码语言:javascript
运行
复制
@Entity
@Table(name = "two_way_services")
public class TwoWayService  {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column
    private String name;

    @OneToMany(cascade = CascadeType.ALL, 
               mappedBy = "twoWayService", 
               fetch = FetchType.EAGER)
    private List<Service> services;

    public TwoWayService() {    
        services = new ArrayList<>();   
        // Add two as default 
        services.addAll(Arrays.asList(new Service(), new Service()));
    }

    public void setService1(Service service) {
        services.set(0, service);
        service.setTwoWayService(this);
    }

    public void setService2(Service service) {
        services.set(1, service);
        service.setTwoWayService(this);
    }

    ...
}

@Entity
@Table(name = "services")
public class Service {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column
    private String name;

    @ManyToOne(optional = false)
    @JoinColumn
    private TwoWayService twoWayService;

    public void setTwoWayService(TwoWayService twoWayService) {
        this.twoWayService = twoWayService;
    }

    ...
}

我在后台使用Derby。数据库模式如下所示:

代码语言:javascript
运行
复制
CREATE TABLE two_way_services (
  id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
  config_name VARCHAR(255) NOT NULL,
  name VARCHAR(80),
  admin_ip VARCHAR(32) NOT NULL,
  connection_state INT NOT NULL
);

CREATE TABLE  services (
  id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
  name VARCHAR(80),
  type INT NOT NULL,
  ruleset VARCHAR(255) NOT NULL,
  two_way_service_id INT,
  FOREIGN KEY (two_way_service_id) REFERENCES two_way_services(id) ON DELETE CASCADE
);

存储库接口:

代码语言:javascript
运行
复制
public interface TwoWayServiceRepository extends Repository<TwoWayService, Integer> {
    <S extends T> S save(S entity);

    ...
}

在我的单元测试中,我发现当我在TwoWayService上调用findOne时,我发现我有4个Services,而不是2个。直接浏览数据库会像我预期的那样显示数据。

代码语言:javascript
运行
复制
TwoWayService tws1 = repo.findOne(1); // get by id
assertThat(tws1.getServices().size()).isEqualTo(2); // fails, expected:<[2]> but was:<[4]>

在调试器中检查它,我在services列表中看到了4个元素:两个是我期望的,另外两个是预期的副本。我不知道这些是从哪里来的。为什么这些额外的对象会出现在列表中?

EN

回答 1

Stack Overflow用户

发布于 2017-03-16 00:48:41

我不确定,但我认为,这是因为您在构造函数中添加了2个服务,在每个setter中添加了1个服务。这使得总共有4个。您测试的是服务的数量,这是您想要测试的吗?

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

https://stackoverflow.com/questions/42813660

复制
相关文章

相似问题

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