web-dev-qa-db-ja.com

Spring Bootで新しいエンティティオブジェクトを作成する

Spring BootプロジェクトでのJPAエンティティーとの混同について、誰かがさらに光を当ててくれることを願っています。 Springプロジェクトではnewを呼び出すべきではないと聞きました。これは、SpringがすべてのBeanを管理できるようにするためであり、Beanの取得は、インジェクションまたはアプリケーションコンテキストを介して明示的に実行できることを理解しています。

ただし、新しいJPAエンティティを取得する方法はわかりません。 @Entityで注釈が付けられたクラスと、データアクセスを処理するリポジトリクラスがある場合、サービスレイヤーで新しいエンティティオブジェクトを取得するにはどうすればよいですか?

アプリケーションのメインクラスに@EntityScanを含めたので、Springはエンティティを認識していると想定します。しかし、ApplicationContextを通じて取得しようとすると、例外が発生します。 @Entityアノテーション付きクラスがSpring Beanであるとは思えないため、これは理にかなっており、@Componentでアノテーションを付けることも正しくないと思います。明確化をいただければ幸いです。

現在newキーワードを使用しており、サービスレイヤーでエンティティオブジェクトを自分で作成しています。非常に簡単な例を以下に示します。

entity/User.Java

@Entity
@Table(name = "users")
public class User {
    @Id
    private Long id;
    private String username;

    // Getters & Setters ...
}

repositories/UserRepository.Java

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    User findByUsername(String username);
}

services/UserServiceImpl.Java

@Service
public class UserServiceImpl implements UserService {
    UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void createAndSaveUser(String username) {
        User user = new User();
        user.setUsername(username);

        userRepository.save(user);
    }
}

また、サービスレイヤーを利用する他のコントローラークラスがいくつかあると想定できます。

この例では、サービスクラスメソッドnewcreateAndSaveUserキーワードを明示的に呼び出しています。これは正しい方法ですか、それとも、JPAエンティティにマップするプロトタイプBeanをSpringから取得する必要がありますか?

4
Jon Catanio

春には、豆、コンポーネント、またはサービスを自動配線/注入できます。ただし、これらの相互作用はリポジトリを介して行われるため、エンティティを自動配線しないでください。リポジトリは自動配線できます

エンティティの新しいインスタンスを作成する場合、newを呼び出すことが許可されます。これは、春。自動ワイヤードリポジトリを使用して、データベースに保存できます。エンティティを取得するには自動配線されたリポジトリが必要になることは明らかなので、これは逆の方法でも機能します。

はい、あなたの方法は正しいです。

ご不明な点がございましたら、お気軽にお問い合わせください。

5
Sven Hakvoort

あなたがしていることは何でも春に完全に有効です。上記の例では、エンティティクラスオブジェクト自体に値を格納する必要があることがわかりました。その絶対に正しい。そのためには、newキーワードを使用する必要があります。それでもエンティティの新しいオブジェクトを作成しない場合は、Bean/POJO/VOクラスを使用して作成し、エンティティオブジェクトをこれらのクラスにマッピングする別のオプションがあります。

しかし、それでも私はあなたがやったことはすべて問題ないことを教えてくれます。

実際に作成しているオブジェクトは、クラスにメソッドが存在するだけでなく、そのメソッドを呼び出すことができるようにnewオブジェクトを作成する必要があるためではなく、値を格納するためのものです(通常、 Javaプロジェクト)。春に@Autowiredアノテーションでオブジェクトを作成します。簡単な例は、サービスクラスでリポジトリを自動接続することです。

これがお役に立てば幸いです。

2
Vikash Kumar

それは私にはいいですね。エンティティを作成し、それをリポジトリに保存するよう依頼します。Springには問題ありません。

これをチェックしましたか? :

http://spring.io/guides/gs/accessing-data-jpa/

楽しんで

1
kj6682