JPA创建现有实体的精简实体版本

时间:2013-10-06 17:29:31

标签: java hibernate angularjs jpa orm

我有一个Angular Client和一个REST后端,通过Spring REST / MVC。数据库是MySQL,我正在使用JPA和Hibernate for ORM。

我的一些前端视图要求我对Java端的某些域数据进行反规范化。 我有一个典型的User Domain对象,包含id,fname,lname等。这个User对象指向数据库中的'user'表。没什么不寻常的。

问题是我有另一个具有以下结构的“simplecost”对象

public class SimpleCost {
 private Long id;
 private Long userId;
 private Long cost;
}

前端使用上述对象的集合来生成这样的视图

userId  cost
1        5.5
2        7.5
3        10.00

但观点应该是什么

Name                cost
John Doe            5.5
Jane Doe            7.5
Rusty Shackleford   10.00

因此,我不需要发送带有SimpleCost对象的userId,而是还需要发送fname和lname。

为了解决这个问题,我尝试了(悲惨地失败)以下方法。 我创建了一个名为“UserBare”的新域对象。这是“用户”的精简版。我的意思是“UserBare”只有一个fname和lname。

我添加了“UserBare”作为SimpleCost对象的新成员

SimpleCost的新建议结构

public class SimpleCost {
 private Long id;
 private Long userId;
 private Long cost;
 private UserBare user;
}

但是我无法使用JPA填充用户对象。我尝试了OnetoOne加入,但没有奏效。我还尝试将String fname,String lname字段添加到SimpleCost,然后使用@SecondaryTable注释将@Column(table =“user”,name =“fName”)填充这些值。这不起作用。

这是我的数据库结构

用户

CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`fName` varchar(100) DEFAULT NULL,
`lName` varchar(100) DEFAULT NULL,
`mName` varchar(100) DEFAULT NULL,
`title` varchar(100) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id_UNIQUE` (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
 /*!40101 SET character_set_client = @saved_cs_client */;

simplecost

CREATE TABLE `simplecost` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`userId` bigint(20) DEFAULT NULL,
`liableCost` decimal(10,2) DEFAULT NULL,
`isActive` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
KEY `fk_simplecost_user1_idx` (`userId`),
CONSTRAINT `fk_simplecost_user` FOREIGN KEY (`userId`) REFERENCES `user`      (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

1 个答案:

答案 0 :(得分:1)

如果你想让联接工作,你必须这样做:

public class SimpleCost {
 private Long id;
 private User user;
 private Long cost;
}

public class User{
    private Long id;
    private String fName;
    private String lName;
    priavte String mName;
    priavate String title;
    private String email;
}

如果我是你,我会将列"id"重命名为"userId""simpleCostId"