0

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 */;
4

1 に答える 1

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"

于 2013-10-07T00:03:18.030 に答える