Spring REST/MVC を介して Angular クライアントと REST バックエンドを使用しています。データベースはMySQLで、ORMにはHibernateでJPAを使用しています。
フロント エンド ビューの一部では、Java 側で一部のドメイン データを非正規化する必要があります。id、fname、lname などの典型的なユーザー ドメイン オブジェクトがあります。このユーザー オブジェクトは、データベース内の「ユーザー」テーブルを指します。珍しいことは何もありません。
問題は、次の構造を持つ別のオブジェクト「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 しかないということです。
SimpleCost オブジェクトの新しいメンバーとして「UserBare」を追加しました
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 */;