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,我能够通过复合键实现连接表结构。