Java 双向@OneToMany与JPA注释的关系不';好像不行

Java 双向@OneToMany与JPA注释的关系不';好像不行,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,这是指这个 实体- //多对一 @Entity @Table public class Address { @Id @GeneratedValue @Column private int addressIdentity; @Column private int houseNo; @Column private char streetNo; @Column private int pincode; @

这是指这个

实体-

//多对一

@Entity
@Table
public class Address {

    @Id
    @GeneratedValue
    @Column
    private int addressIdentity;

    @Column
    private int houseNo;

    @Column
    private char streetNo;

    @Column
    private int pincode;

    @Column
    private String city;

    @Column
    private String state;

    @Column
    private String country;

    @ManyToOne
       @JoinTable(name="PersonAddress", 
            joinColumns=@JoinColumn(name="addressId", insertable = false, updatable = false),
            inverseJoinColumns=@JoinColumn(name="personId", insertable = false, updatable = false)
       )
    private Person person;
    // getters and setters

一对多

@Entity
@Table
public class Person {

    @Id
    @GeneratedValue
    @Column
    private int personId;

    @Column
    private String name;

    @Column
    private String designation;

    @OneToMany
    @JoinTable(name = "PersonAddress", 
                            joinColumns = @JoinColumn(name = "personId"), 
                                inverseJoinColumns = @JoinColumn(name = "addressId"))
    private Set<Address> addSet = new HashSet<Address>();
    // getters and setters

我越来越-

Jan 07, 2017 9:47:35 PM org.hibernate.action.internal.UnresolvedEntityInsertActions logCannotResolveNonNullableTransientDependencies
WARN: HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
    Unsaved transient entity: ([ManyToOne_OneToManyMappingWithJoinTable.Person#0])
    Dependent entities: ([[ManyToOne_OneToManyMappingWithJoinTable.Address#1]])
    Non-nullable association(s): ([ManyToOne_OneToManyMappingWithJoinTable.Address.person])
Exception in thread "main" org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved beforeQuery current operation : ManyToOne_OneToManyMappingWithJoinTable.Address.person -> ManyToOne_OneToManyMappingWithJoinTable.Person
    at org.hibernate.action.internal.UnresolvedEntityInsertActions.checkNoUnresolvedActionsAfterOperation(UnresolvedEntityInsertActions.java:122)
    at org.hibernate.engine.spi.ActionQueue.checkNoUnresolvedActionsAfterOperation(ActionQueue.java:418)
    at org.hibernate.internal.SessionImpl.checkNoUnresolvedActionsAfterOperation(SessionImpl.java:621)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:684)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669)
    at ManyToOne_OneToManyMappingWithJoinTable.ManyToOne_OneToManyMappingWithJoinTableImpl.main(ManyToOne_OneToManyMappingWithJoinTableImpl.java:40)
它与hbms完美配合

请建议


谢谢Vlad和Neil,它可以工作,但有一个问题如下所述-

这是使用HBMs创建的结构。因此,注释也必须如此

CREATE TABLE person_address
(
  addressid integer NOT NULL,
  personid integer NOT NULL,
  CONSTRAINT person_address_pkey PRIMARY KEY (addressid , personid ),
  CONSTRAINT fkkpp6mysmnyiywx3q33yxr1gbe FOREIGN KEY (personid )
      REFERENCES person (person_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fkrpk0jx2y558su288tx9kd5cs6 FOREIGN KEY (addressid )
      REFERENCES address (address_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
当我这样做的时候-

@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private Set<Address> addSet = new HashSet<Address>();

您可以看到主键是而不是像HBMs中那样的addressid和personid的组合。请建议。

您需要在一对多侧添加级联:

@OneToMany(cascade = CascadeType.ALL)
然后,将
@ManyToOne
侧更改为:

@ManyToOne
@JoinTable(name="PersonAddress", 
    joinColumns=@JoinColumn(name="addressId"),
    inverseJoinColumns=@JoinColumn(name="personId")
)
private Person person;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private Set<Address> addSet = new HashSet<Address>();
然后将
@OneToMany
侧连接到:

@ManyToOne
@JoinTable(name="PersonAddress", 
    joinColumns=@JoinColumn(name="addressId"),
    inverseJoinColumns=@JoinColumn(name="personId")
)
private Person person;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private Set<Address> addSet = new HashSet<Address>();
@OneToMany(cascade=CascadeType.ALL,mappedBy=“person”)

私有集。

您需要在一对多侧添加级联:

@OneToMany(cascade = CascadeType.ALL)
然后,将
@ManyToOne
侧更改为:

@ManyToOne
@JoinTable(name="PersonAddress", 
    joinColumns=@JoinColumn(name="addressId"),
    inverseJoinColumns=@JoinColumn(name="personId")
)
private Person person;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private Set<Address> addSet = new HashSet<Address>();
然后将
@OneToMany
侧连接到:

@ManyToOne
@JoinTable(name="PersonAddress", 
    joinColumns=@JoinColumn(name="addressId"),
    inverseJoinColumns=@JoinColumn(name="personId")
)
private Person person;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")
private Set<Address> addSet = new HashSet<Address>();
@OneToMany(cascade=CascadeType.ALL,mappedBy=“person”)


私有集。

不存在双向关系。你需要“mappedBy”来that@NeilStockton:放在哪里。请提出建议。为什么不把它放在
@OneToMany
注释中,就像互联网上的文档页面那样you@NeilStockton:那么它就不是一个联接表了。这在您的JPA提供程序中被称为一个bug,您应该报告它。不存在双向关系。你需要“mappedBy”来that@NeilStockton:放在哪里。请提出建议。为什么不把它放在
@OneToMany
注释中,就像互联网上的文档页面那样you@NeilStockton:那么它就不是一个联接表了。这在您的JPA提供程序中被称为一个bug,您应该报告它。同样的异常仍然存在。请提出建议。在使用包装类之后,尝试将@Id从int更改为integerName异常。由于映射是双向的,因此异常建议-在保存这些依赖实体之前,必须先将未保存的临时实体保存在操作中。可以清楚地看到,两者都是人和地址实体,并且相互依赖。这是一个僵局。异常发生在-
session.save(address1)上会话前保存(地址2);session.save(person1)任何建议。感谢Vlad,我能够通过复合键实现连接表结构。同样的异常仍然存在。请提出建议。在使用包装类之后,尝试将@Id从int更改为integerName异常。由于映射是双向的,因此异常建议-在保存这些依赖实体之前,必须先将未保存的临时实体保存在操作中。可以清楚地看到,两者都是人和地址实体,并且相互依赖。这是一个僵局。异常发生在-
session.save(address1)上会话前保存(地址2);session.save(person1)任何建议。感谢Vlad,我能够通过复合键实现连接表结构。