【发布时间】:2015-11-19 16:27:42
【问题描述】:
带有hibernate和mysql 5.7的spring-jpa(依赖由spring platform-bom-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() 方法,并显示输出。