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

标签 java hibernate angularjs jpa orm

我有一个 Angular 客户端和一个通过 Spring REST/MVC 的 REST 后端。数据库是 MySQL,我使用 JPA 和 Hibernate 进行 ORM。

我的一些前端 View 要求我对 Java 端的一些域数据进行反规范化。 我有一个典型的用户域对象,其中包含 id、fname、lname 等。此用户对象指向数据库中的“用户”表。没有什么异常。

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

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

前端利用上述对象的集合来生成这样的 View

userId  cost
1        5.5
2        7.5
3        10.00

但是 View 应该是

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 join 但没有成功。我还尝试将 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”

关于java - JPA 创建现有实体的精简实体版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19211725/

相关文章:

java - 非标准 HTTP 方法和 Apache Http 组件

java - 无法从包裹中读取输入 channel 文件描述符

java - 如何通过没有索引列的XML设置List对象的 "one-to-many"映射

javascript - 如何在同一个项目中同时使用 JWPlayer 6 和 JWPlayer 7?

javascript - 错误: Could not resolve 'storysolo' from state 'index'

java - 警告 : No mapping found for HTTP request with URI [/Spring3MVC/hello. html] 在 DispatcherServlet 中,名称为 'spring'

java - 如何从 "mdb-select"列表中选择选项

java - junit 测试中的 spring-data-jpa bean 验证

java - 名为 xyz 的实体管理器没有持久性提供程序

javascript - angularjs - ng-repeat 仅适用于 $index