java - 没有关系的 JPA 外键

标签 java jpa

我有两个实体 MailAttachment。我想在它们之间创建约束但不映射关系。

例如:

class Mail {

    @Id
    private String id;

    ...
} 

class Attachment {

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

    @Id
    private String id;

    ...
}

所以这只是一个临时的例子只是为了说明。在这种情况下,我如何才能让 JPA 创建约束而不被迫将 Mail 映射到 Attachment 中?

我不想这样做:

class Attachment {

    @Id
    @ManyToOne
    private Mail mail;

    @Id
    private String id;

    ...
}

最佳答案

JPA 通过 @OneToMany@ManyToOne 等关系注解创建两个实体之间的约束和关系。没有这些注释,您必须自己手动强制执行约束和关系。

例如,您可以在Mail 上有一个工厂方法来创建一个附件 在这个工厂方法中实现他们的约束并确保一个附件 只能通过此方法创建。

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;
   }
}

然后实现一个服务类来协调邮件业务用例的所有事情。客户端应该使用这个服务类来管理邮件。例如:

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); 
    }              
 }

关于java - 没有关系的 JPA 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771841/

相关文章:

java - 如何在 jpa 监听器中获取实体管理器或事务

java - Firebird + JDBC : Getting the generated key from an insert

java.lang.IllegalArgumentException : view is not a child, 无法隐藏

java - 使用正则表达式分割字符在java中返回空值

java - getCursor() 在我的 actionListener 中不起作用

java - 添加一个方面来捕获异常并返回 null

java - Azure Spring Boot功能-如何将触发器和输入绑定(bind)同时传递给handleRequest方法?

java - 有没有办法让查询在 eclipselink 中触发

hibernate - JPA 在简单的 byte[] 字段级别懒惰

java - JPA Criteria builder IN 子句查询