没有外键的 JPA 一对一关联不起作用



我正在使用Hibernate/JPA,有3个表:

Contact
pk contact_id
fk member_id
Employee
pk employee_id
fk member_id
Members
pk member_id

我有:

@Entity(name = "Contact" )
public class Contact implements Serializable {
@Id
@SequenceGenerator(allocationSize = 1, name = "contact_sequence", sequenceName = "contact_ids")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "contact_sequence")
private java.lang.Long contact_id;
@OneToOne(cascade = CascadeType.ALL, targetEntity = Members.class)
@JoinColumn(name = "member_id")
private Members member;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member", referencedColumnName = "member")
private Employee employee;

@Entity(name = "Employee")
public class Employee implements Serializable {
@Id
@SequenceGenerator(allocationSize = 1, name = "employee_sequence", sequenceName = "employee_ids")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_sequence")
private java.lang.Long employee_id;

@Entity(name = "Members")
@Table(name = "Members")
public class Members implements Serializable {
@Id
@SequenceGenerator(allocationSize = 1, name = "members_sequence", sequenceName = "member_ids")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "members_sequence")
private java.lang.Long member_id;

我的问题与Contact实体private Employee employee;有关。当我启动我的 Jboss 服务器时:

StartException in service jboss.persistenceunit.

问题

如何在Contact实体上注释private Employee employee;

谢谢

你几乎正确地定义了private Members member;,那么有没有理由不对private Employee employee;做同样的事情?

喜欢:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employee", referencedColumnName = "employee_id")
private Employee employee;

也是一个简单的链接,只是为了交叉检查整体@JoinColumn功能

===编辑===

看起来确实存在数据结构问题,因为从一开始,关系就是ManyToOne,

如果您可以尝试以下示例:

//Employee
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "contact_id", referencedColumnName = "contact_id")
private Contact contact;
//Contact
@OneToMany(fetch = FetchType.LAZY, mappedBy = "employee_id")
private List<Employee> employees = new ArrayList<>();

然后通过选择contact.getEmployees()应该可以解决问题

最新更新