代码之家  ›  专栏  ›  技术社区  ›  NA.

JPA未保存@OneToMany关系的外键

  •  18
  • NA.  · 技术社区  · 17 年前

    我使用Spring和Hibernate作为JPA提供商,并试图获得@OneToMany(一个有许多电话号码的联系人)来将外键保存在电话号码表中。从我的表单中,我得到一个联系人对象,其中有一个电话(号码)列表。联系人被正确持久化(Hibernate从指定的序列中获取PK)。电话(号码)列表也会保留正确的PK,但联系人表中没有FK。

    public class Contact implements Serializable {
    
        @OneToMany(mappedBy = "contactId", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
        private List<Phone> phoneList;
    
    }
    
    public class Phone implements Serializable {
    
        @JoinColumn(name = "contact_id", referencedColumnName = "contact_id")
        @ManyToOne
        private Contact contactId;
    
    }
    
    @Repository("contactDao")
    @Transactional(readOnly = true)
    public class ContactDaoImpl implements ContactDao {
    
        @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
        public void save(Contact c) {
            em.persist(c);
            em.flush();
        }
    }
    
    
    @Controller
    public class ContactController {
        @RequestMapping(value = "/contact/new", method = RequestMethod.POST)
        public ModelAndView newContact(Contact c) {
            ModelAndView mv = new ModelAndView("contactForm");
            contactDao.save(c);
            mv.addObject("contact", c);
            return mv;
        }
    }
    

    希望我得到了上面所有的相关信息,否则请告诉我。

    4 回复  |  直到 8 年前
        1
  •  28
  •   archit kumar cletus    7 年前

    您必须自己管理Java关系。对于这类事情,您需要以下内容:

    @Entity
    public class Contact {
      @Id
      private Long id;
    
      @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "contact")
      private List<Phone> phoneNumbers;
    
      public void addPhone(PhoneNumber phone) {
         if (phone != null) {
            if (phoneNumbers == null) {
                phoneNumbers = new ArrayList<Phone>();          
            }
            phoneNumbers.add(phone);
            phone.setContact(this);
         }
      }
    
      ...
    }
    
    @Entity
    public class Phone {
      @Id
      private Long id;
    
      @ManyToOne
      private Contact contact;
    
      ...
    }
    
        2
  •  6
  •   Mark Byers    15 年前

    作为对克莱特斯回答的回答。我想说的是,拥有 @column @OneToMany 注释是使用 @JoinColumn

    public void addPhone(PhoneNumber phone) {
        if (phone == null) {
            return;
        } else {
            if (phoneNumbers == null) {
                phoneNumbers = new ArrayList<Phone>();
            }
            phoneNumbers.add(phone);
            phone.setContact(this);
        }
    }
    
        3
  •  5
  •   samsong8610    8 年前

    如果联系人电话关系是单向的,您还可以替换 mappedBy 在里面 @OneToMany 注释 @JoinColumn(name = "contact_id") .

    @Entity
    public class Contact {
      @Id
      private Long id;
    
      @OneToMany(cascade = CascadeType.PERSIST)
      @JoinColumn(name = "contact_id")
      private List<Phone> phoneNumbers;
    
      // normal getter/setter
      ...
    }
    
    @Entity
    public class PhoneNumber {
      @Id
      private Long id;
    
      ...
    }
    

    相似 JPA @OneToMany -> Parent - Child Reference (Foreign Key)

        4
  •  2
  •   SkyWalker    8 年前

    我不认为 方法是必需的,您只需在phone对象中设置联系人:

    phone.setContact(contact);
    
        5
  •  1
  •   Tom Chamberlain    6 年前

    如果您希望您的关系是单向的,即只能从联系人导航到手机,您需要添加

    @JoinColumn(name = "contact_id", nullable = false)
    

    @OneToMany 在父实体上。

    nullable = false 至关重要 如果希望hibernate填充子表上的fk

        6
  •  0
  •   Ilya Lysenko    6 年前

    @Entity
    public class Contact {
        @Id
        private Long id;
    
        @JoinColumn(name = "contactId")
        @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
        private Set<Phone> phones;
    }
    
    @Entity
    public class Phone {
        @Id
        private Long id;
        private Long contactId;
    }