【问题标题】:extra NULL item in spring-jpa one-to-many list attributespring-jpa 一对多列表属性中的额外 NULL 项
【发布时间】:2015-11-19 16:27:42
【问题描述】:

带有hibernate和mysql 5.7的spring-jpa(依赖由spring platform-b​​om-1.1.4.RELEASE管理)

实体类:

@Entity
@Table(name = "activity")
public class ActivityEntity
{

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

    // optional
    @Column(name="project_id")
    private Integer projectId;

    @OneToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="container_id")
    private ActivityEntity container;

    @OneToMany(mappedBy="container", cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
    @OrderColumn(name="order")
    private List<ActivityEntity> activities;
    
    private String name;
    private String description;

...
}

DAO 类:

public interface IActivityDao extends JpaRepository<ActivityEntity, Integer>
{

    List<ActivityEntity> findByContainerId(int containerId);
    
}

数据库表:

CREATE TABLE `activity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `project_id` bigint(20) DEFAULT NULL,
  `container_id` bigint(20) DEFAULT NULL,
  `name` varchar(128) NOT NULL,
  `description` varchar(256) DEFAULT NULL,
  `type` varchar(32) NOT NULL,
  `mode` varchar(32) NOT NULL,
  `tag` varchar(32) DEFAULT NULL,
  `script` longtext,
  `order` int(11) DEFAULT '1',
  `created_user_id` varchar(45) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL,
  `updated_user_id` varchar(45) DEFAULT NULL,
  `updated_date` datetime DEFAULT NULL,
  `projectId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `container_id` (`container_id`),
  CONSTRAINT `fk_container_id` FOREIGN KEY (`container_id`) REFERENCES `activity` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8;

数据库表内容:

单元测试代码:

public class ActivityDaoTest extends AbstractDaoTest
{
    @Resource
    private IActivityDao activityDao;
    
    @Test
    public void testFindOne() throws Exception {
        ActivityEntity activity = activityDao.findOne(210);
        ActivityEntity root = activity.getContainer();
        
        int level = 0;
        printActivity(activity, level);
        Assert.assertNotNull(activity);
        
        if (root != null) {
            level = 0;
            printActivity(root, level);
        }
    }
...
}

在上面的测试代码中,root.getActivities()和activity.getActivities()分别返回5和4项,第一项为null。

我错过了实体中的某些内容吗?感谢您的帮助。

【问题讨论】:

  • 首先:OneToMany 的所有者端应该是 ManyToOne,而不是 OneToOne。其次,显示您的 printActivity() 方法,并显示输出。

标签: spring hibernate jpa


【解决方案1】:

我会回答我赢得的问题(发布得太早):

  1. 从实体中删除 order 属性
  2. 表中order列的值从0开始(NULL项为列表中0的索引)

这解决了我的问题。

【讨论】:

  • 嗯,不,这只是推迟了您想通过订单列订购列表项目的问题,然后发现您的 JPA 提供商可能做错了什么。我使用了不同的提供程序,所以不会打扰我,但如果您现在不调试它可能会在以后打扰您
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2021-05-23
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
相关资源
最近更新 更多