我有一个Angular Client和一个通过Spring REST / MVC的REST后端。该数据库是MySQL,我在Hibernate for ORM中使用JPA。
我的某些前端视图要求我在Java方面对某些域数据进行非规范化。
我有一个具有id,fname,lname等的典型User Domain对象。此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 */;
简单成本
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 */;
最佳答案
如果您希望联接起作用,则必须执行以下操作:
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"