2017-04-25 1 views
0

を使用して保存しようと両方のエンティティは、それらの間での参加があります。は実体が前に私は2つのエンティティ、ユーザと操作を持つPOSTメソッド

@Entity 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long userId; 

    @Basic 
    private String username; 

    private String password; 

    //Getters and Setters 
} 

@Entity 
public class Operation implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long userId; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    User user; 

    //Getters and Setters 

} 

両方のエンティティがあまりにもリポジトリを持っています。

私の文脈では、ユーザ(オペレータ)がログされたときに、ユーザエンティティがセッションスコープ(HttpSession)にロードされます。 システム上のユーザの操作ごとに、その操作が操作リポジトリを操作して登録されます。

私の質問は次のとおりです。どのようにUserエンティティ(セッション中)をDatabase内のレジスタの前の操作に設定できますか?

リポジトリメソッドをオーバーライドすることはできますか?

EDIT 1:

動作はHTTP POSTメソッドを使用して、Webインターフェイスを介して保存されています。私は保存するためにURIを使用し続ける必要があります。同様に:

URIます。http:// localhost:9874 /操作 DATA:{ "名": "オペレーション名"}

ありがとう!

+0

あなたは春データJPAが提供する保存メソッドをオーバーライド意味していますか? – pvpkiran

+0

@pvpkiranまさに!私はこれが私の解決のための道だと思います... –

答えて

3

ホープ:あなたを標準のSpring Data Rest投稿をhttp://localhost:9874/operationsにすることができ、カスタムリポジトリやコントローラは必要ありません。あなたはユーザーがセッションに保存されていると言う

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_writing_an_annotated_handler

@RepositoryEventHandler 
public class OperationEventHandler { 

    @HandleBeforeSave 
    public void handleOperationSave(Operation operation) { 

    } 
} 

。私はそれを取るあなたは春のセキュリティを使用していない?そうでない場合は、あなたがしようとすると、ワイヤのHttpServletRequestを自分のイベントハンドラにまたはこれらの質問に対する回答で概説したような静的ラッパー・コールを使用必要があります

SecurityContextHolder.getContext().getAuthentication(); 

:あなたがいるなら、あなたは、静的呼び出しを使用して、現在のユーザーを取得できます。あなたはHttpSessionのを得ることができます。このことから

Spring: how do I inject an HttpServletRequest into a request-scoped bean?

。まさにこのシナリオで

HttpServletRequestの中に、次のショー配線

Spring Data Rest - How to receive Headers in @RepositoryEventHandler

ので、あなたのハンドラは次のようになります。

@RepositoryEventHandler 
public class OperationEventHandler { 

    @Autowired 
    private HttPServletRequest request; 

    @HandleBeforeSave 
    public void handleOperationSave(Operation operation) { 

     User user = (User)request.getSession().getAttribute("userKey"); 
     operation.setUser(user); 
    } 
} 
+0

良い答えのためのアラン!はい、SB Securityを使用しています。申し訳ありませんが...しかし、それは私のために非常にうまく動作しますが、私は1つの事を追加しました... OperationEventHandlerのアノテーション@Componentを追加する必要があった...他のもの、私は.save()メソッドリポジトリから手動でこのハンドラも呼び出されますか? –

+1

いいえSDR固有です。何も挿入する必要がない場合は、両方の状況で動作する標準のJPA Event Listenerを使用できます。 http://www.objectdb.com/java/jpa/persistence/event –

0

カスタムリポジトリインタフェースを作成し、その実装を記述します。例えば。

public interface OperationRepositoryCustom { 

    <T extends Operation> T saveCustomized(Operation operation); 
} 

実装クラスは次のようになります。

public class OperationRepositoryImpl implements OperationRepositoryCustom{ 
    //You can autowire OperationRepository and other dependencies 

    @Autowired 
    OperationRepository operationRepository; 

    @Override 
    public Operation saveCustomized(Operation operation) { 
     //put your code to update operation with user and save it by calling operationRepository.save(). 
    } 
} 

カスタム実装では、リポジトリ+ Implと同じ名前を持つ必要があるという命名規則に注意してください。リポジトリのインターフェースがOperationRepository呼び出されたのであれば、あなたのカスタムリポジトリインターフェースは、あるべきOperationRepositoryCustomとIMPLはOperationRepositoryImpl

名前を付ける必要があり、それはあなたが関連付けを設定することが可能なイベントハンドラ保存事前に作成することができます

+0

素早くお答えいただきありがとうございます!私は1つのことを話すことを忘れない!私は操作を保存するためにREST APIを使用します。私はあなたの答えを使用する場合、私はアプリを壊してしまうでしょうか? –

関連する問題