spring-jpa一对多列表属性中的额外NULL项

时间:2015-11-19 16:27:43

标签: spring hibernate jpa

spring-jpa with hibernate和mysql 5.7(依赖于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;

数据库表内容: enter image description here

单元测试代码:

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。

我是否想念实体中的某些内容?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我会回答我的问题(过早发布):

  1. 从实体
  2. 中删除订单属性
  3. 表中 order 列的值从0开始(NULL项目用于列表中的索引0)
  4. 这解决了我的问题。