2016-06-12 22 views
2

私は2つのエンティティMailAttachmentを持っています。私はそれらの間に制約を作成したいが、関係をマッピングしない。例えば関係のないJPA外部キー

class Mail { 

    @Id 
    private String id; 

    ... 
} 

class Attachment { 

    @Id 
    // @... constraint with Mail.id ??? 
    private String mailId; 

    @Id 
    private String id; 

    ... 
} 

だから、これはただ説明するだけの一時的な例です。この場合、どうすればJPAがMailAttachmentの中に強制的にマップする必要はありませんか?

私はこれを行うにはしたくない:

class Attachment { 

    @Id 
    @ManyToOne 
    private Mail mail; 

    @Id 
    private String id; 

    ... 
} 
+2

使用FlywayDBか、LiquiBaseをあなたを作成するために:mail.For例を管理するには、このサービスクラスを使用する必要があります

public class Mail{ @Id private String id; public Attachement createAttachement(){ return new Attachement(id); } } public class Attachement{ @Id private String id; @Column(name="mail_id") private String mailId; /*************************************************************************** I will put all the domain class in the same package and make the constructor as package scope to reduce the chance that this object is created by other class accidentally except Mail class. **************************************************/ Attachement(String mailId){ this.mailId = mailId; } } 

その後メールのビジネスユースcases.Clientに関するすべてのものをコーディネートするサービスクラスを実装スキーマをJPAに任せるのではなく、いずれにしても、失わせたくないデータを含む本番スキーマをあるバージョンから次のバージョンに移行するには、それが必要です。 –

+0

私はそれを見ています、ありがとう。とにかくJPAを使用して私の質問に任意のソリューションですか?ちょうど知っている。 – dash1e

+0

私が知っているわけではありません。しかし、なぜManyToOneの関連付けが必要でないのか(またなぜこのManyToOneのIDの部分を作るのか)はわかりません。 –

答えて

2

JPAは関係注釈など@OneToMany@ManyToOneによって制約と2つのエンティティ間の関係を作成します。これらの注釈がなければ、自分で手動で制約と関係を強制する必要があります。

たとえば、Mailにファクトリメソッドを設定してAttachementを作成し、このファクトリメソッドで制約を実装し、Attachementをこのメソッドでのみ作成できることを確認します。

public class MailService{ 

    private EntityManager em; 

    @Transcational 
    public void createMailWithAttachement(){ 
     Mail mail = new Mail(xxxx); 
     em.persist(mail); 

     Attachement attachement = mail.createAttachement(); 
     em.persist(attachement); 
    } 


    @Transcational 
    public void newAttachmentOnMail(String mailId, XXXXX){ 
     Mail mail = em.find(mailId, Mail.class); 

     if (mail == null){ 
     throws new ApplicationException("Mail does not exist.Please Check"); 
     } 

     Attachement attachement = mail.createAttachement(); 
     em.persist(attachement); 
    }    
} 
+0

DBの制約はありますか? – dash1e

+1

'Attachment.mail_id'のFK制約を' Mail.id'に手動で設定します。 –

+0

JPAが自動的にスキーマを作成した後、手動で追加するにはどうすればいいですか? – dash1e

関連する問題